baekjoon 2563

윤동환·2023년 1월 7일
0

Algorithm

목록 보기
30/54
post-thumbnail

색종이

내가 작성한 코드

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으로 잘 출력됨) 이중 중첩되면 중복된 값을 한 번 더 빼주어 몇면이 어디에서 이중 중복되는지 식별하는 로직이 필요했다.
  • 이를 해결하기 위해선 색종이의 시작점 뿐만 아니라 색종이 끼리 겹차는 교점까지 다 식별해야하였기 때문에 일반적으로 구현하는 방식인 도화지 순회 방식으로 구현 방향을 바꾸었다.

결과

profile
모르면 공부하고 알게되면 공유하는 개발자

0개의 댓글