#72. 백준 2563번 문제 풀이: 색종이 | 문제 원본 보기 |
--입력-- 3 3 7 15 7 5 2 --출력-- 260
일반적으로 생각하면 색종이 하나의 넓이는 10x10=100 이고, 겹쳐지게 색종이를 붙인다면 100 + 100 -(겹친부분 넓이) 를 해서 계산할 것이다. 세번째 색종이가 첫번째 두번째 모두와 일부 겹쳐지게 붙인다면? ..계산이 복잡해 진다. 일반적인 수학적인 방법이 아닌 다른 알고리즘을 생각해 보자. 도화지 크기가 100 x 100 이라 했고, 색종이가 10 x 10 이라고 했다. 이것을 배열이라고 생각하고 풀어보자. 100 x 100 의 0값으로 채워진 배열(도화지)에 10 x 10 의 값들(색종이)은 1로 채우자. 결국 여러장의 색종이가 겹치는 것과 상관없이, 배열값이 1 인 값들의 합이 색종이가 붙은 면적이 된다. 아래 그림처럼 도화지 사각형에 1로된 색종이들이 겹쳐있더라도, 겹침과 상관없이 1로 체크된 부분을 채워진 면적으로 볼 수 있다. --------- | 1111 | | 111111 | | 111111 | | 1111 | ---------
S = [[0]*100 for _ in range(100)]
# 도화지 리스트. 100 x 100 2차원 배열, 0으로 초기화
N = int(input())
# 숫자를 입력받아 정수형으로 변환해서 색종이 수 N 에 대입.
for _ in range(N): # 주어진 색종이 개수만큼 루프
x, y = map(int, input().split())
# 색종이 좌표 값을 받아서 정수형으로 변환해서 x, y에 대입
for i in range(x, x + 10): # x 축으로 10칸
for j in range(y, y + 10): # y 축으로 10칸
S[i][j] = 1 # 색종로 채워짐
# 색종이를 모두 붙였으면, 면적을 계산(배열값이 1인 개수)
sum = 0 # 면적, 초기값 0
for i in range(100): # 도화지 가로크기
for j in range(100): # 도화지 세로크기
if S[i][j] == 1:
sum += 1 # 배열이 1값이면 면적 더함
print(sum) # 색종이가 붙은 배열개수(면적) 출력