알고리즘

파이썬 / BOJ / 2563번 (색종이)

snowfield 2021. 2. 10. 17:17

문제

 

가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.

 

예를 들어 흰색 도화지 위에 세 장의 검은색 색종이를 그림과 같은 모양으로 붙였다면 검은색 영역의 넓이는 260이 된다.

 

 

입력

 

첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고, 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다. 색종이의 수는 100 이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다

 

출력

 

첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.

 

예제 입출력

 

예제 입력 예제 출력
3
3 7
15 7
5 2
260

 

풀이

 

처음에 문제를 여러 개의 색종이의 모든 면적을 구한 다음 겹치는 부분을 빼려고 하는.. 복합한 구현을 생각했다.. ^^

하지만 흰 도화지의 면적이 주어졌기 때문에 해당 조건을 이용해서 이차원 배열을 0으로 초기화했고,

검은색 색종이의 경우 1로 갱신해주었다. 그리고 겹치는 부분은 어쨌든 똑같이 1로 갱신되기 때문에 처음에 생각한 구현한 방법처럼 겹치는 부분을 다시 빼주는 수고는 하지 않아도 된다.

결국 검은색 부분은 흰 도화지에 해당하는 2차원 배열에 1에 해당하기 때문에 1의 개수를 구하면 면적이 나오게 된다.

 

import sys

N = int(sys.stdin.readline())
#흰 도화지
paper = [[0]*100 for _ in range(100)] 

for _ in range(N):
    x, y = map(int, sys.stdin.readline().split())
    for i in range(y,y+10):
        for j in range(x, x+10):
            paper[i][j] = 1
count = 0
for i in range(100):
    count += paper[i].count(1)
print(count)