-
[5일차](문제 번호 : 2536, 색종이) 도전백준 문제 풀이 2023. 7. 22. 22:41
1. 문제 요약
100*100 도화지에 10*10 색종이를 여러 장 붙인다. (겹치게 붙일 수 있다.) 이때, 색종이가 차지하는 넓이를 구하는 프로그램을 구해야한다.
위와 같은 경우, 넓이는 260이다.
입력은 다음과 같다.
첫 줄 : 색종이 개수
다음 줄 : 색종이 위치 ( a, b ) ( a는 색종이의 왼쪽 변과 도화지의 왼쪽 변과의 거리, b는 색종이의 아래쪽 변과 도화지의 아래쪽 변과의 거리)
예시.
입력
3 3 7 15 7 5 2
출력
260
2. 풀어보기
100*100의 2차원 리스트를 만들어 0으로 채운 뒤, 입력을 통해 색종이가 차지하는 공간에 해당하는 위치를
1로 바꾸고, 1의 개수를 총 넓이로써 출력하면 될 것 같았다.
1. 색종이 개수 입력받기
2. 도화지 2차원 리스트 만들기
3. 색종이의 시작위치에 따른 인덱스 번호 부여하고, 가로 세로 각각 +9만큼의 인덱스 1로 변경하기
4. 도화지 리스트에서 1의 개수 세기
3. 코드
1. 색종이 개수 입력받기
N = int(input())
2. 도화지 2차원 리스트 만들기
paper = [[] for _ in range(100)] for i in range(100): for _ in range(100): paper[i].append(0)
3. 색종이의 시작위치에 따른 인덱스 번호 부여하고, 가로 세로 각각 +9만큼의 인덱스 1로 변경하기
for i in range(N): a, b = map(int, input().split()) x, y = a, 90-b for j in range(10): for k in range(10): paper[y+k][x+j] = 1
세로 부분의 인덱스는 도화지 리스트에서는 아래로 갈수록 뒤의 인덱스이므로,
도화지 세로길이 - 색종이 세로길이 - 시작위치로써 세로 시작을 계산하였다.
(100-10-b)
4. 도화지 리스트에서 1의 개수 세기
count = 0 for l in paper: count += l.count(1) print(count)
paper.count(1)은 안된다. 왜냐하면, paper는 2차원 리스트이기에 1이라는 요소는 하나도 없기 때문이다.
4. 개선 방안
먼저, 도화지 2차원 리스트를 만들 때,
[]가 100개 들어있는 리스트를 만들고, 각 []에 0을 100개 채우는 식으로 진행했었지만,
[[0] * 100 for _ in range(100)] 와 같은 식을 이용하면 굳이 그러지 않았어도 됐었다.
또한, 목적이 넓이이기에 굳이 세로부분의 인덱스를 반전시켜 정확한 위치를 통한 계산이 필요없었다.
사실, for문을 2-3중으로 쓰고, 스케일이 큰 계산을 해서 시간 초과가 날 줄 알았는데, 나지 않아서 다행이다.
'백준 문제 풀이' 카테고리의 다른 글
[7일차](문제 번호 : 11005, 진법 변환 2) 도전 -1 (0) 2023.07.24 [6일차](문제 번호 : 2745, 진법 변환) 도전 (0) 2023.07.23 [4일차](문제 번호 : 2566, 최댓값) 도전 (0) 2023.07.21 [3일차](문제 번호 : 10798, 세로읽기) 도전 (0) 2023.07.20 [2일차](문제 번호 : 2738, 행렬 덧셈) 도전 (0) 2023.07.19