색종이
내가 작성한 코드
N = int(input())
canvas = [[0] * 100 for i in range(100)]
count = 0
for i in range(N):
x, y = map(int, input().split())
for a in range(x, x + 10):
for b in range(y, y + 10):
if canvas[a][b] == 0:
canvas[a][b] = 1
count += 1
print(count)
고려한 사항
- 일단 밑에 적어둔 실패 코드를 기반으로 생각을 바꾸어 구현하였다.
- canvas = [[0] * 100 for i in range(100)]
-> [0] * 100이렇게 구현하게 되면 1차 배열 타입으로 0으로 초기화된 100크기의 1차 배열이 생성된다.
list comprehension로 100번 반복하여 캔버스를 만들어 주었다.
- 이렇게 구현하면 최대 인덱스는 99까지 되는것을 고려하여야 한다.
-> 처음에 무심히 101로 준뒤 x, y의 range를 x + 11처럼 해버려서 색종이의 크기가 121이 되버렸다..
내가 실패한 코드
from itertools import compress
N = int(input())
arr = []
overlap = 0
for i in range(N):
arr.append(list(map(int, input().split())))
for a in range(N):
i = 1
while a + i < N:
xg = abs(arr[a][0] - arr[a + i][0])
yg = abs(arr[a][1] - arr[a + i][1])
if xg < 10 and yg < 10:
overlap += (10 - xg) * (10 - yg)
i += 1
print(100 * N - overlap)
의도
- 주어진 색종이의 넓이준 겹치는 부분을 총 색종이의 넓이에서 빼주면 도화지를 다 검사하지 않아도 구할수 있겠다는 생각이었다.
실패 이유
- 결과적으로 1번 중복되는 넓이는 배제가 가능하였으나(ex. 0 0, 5, 5, 10, 10일 때 250으로 잘 출력됨) 이중 중첩되면 중복된 값을 한 번 더 빼주어 몇면이 어디에서 이중 중복되는지 식별하는 로직이 필요했다.
- 이를 해결하기 위해선 색종이의 시작점 뿐만 아니라 색종이 끼리 겹차는 교점까지 다 식별해야하였기 때문에 일반적으로 구현하는 방식인 도화지 순회 방식으로 구현 방향을 바꾸었다.
결과