알고리즘/백준

[2563] 색종이 (Python)

DeveloperJason 2022. 12. 27. 13:41

 

 

간단하게 생각하다 틀린 문제입니다.

 

 

2563번: 색종이

가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록

www.acmicpc.net

 

처음 접근은 단순히 겹치는 구간을 N*100에서 빼면 된다고 생각했습니다.

 

 

틀린 코드


#색종이의 크기는 모두 10*10이다
#겹치는 부분을 빼면 될 것.

N = int(input())
position_arr = []
for _ in range(N):
    position_arr.append(list(map(int,input().split())))

# position_arr.sort()
# print(position_arr)
area = N*100
for i in range(N-1):
    for j in range(i+1,N):
        if abs(position_arr[i][0]-position_arr[j][0]) < 10 and\
            abs(position_arr[i][1]-position_arr[j][1]) < 10:
            area -=(10-abs(position_arr[i][0]-position_arr[j][0]))*(10- abs(position_arr[i][1]-position_arr[j][1]))
print(area)

 

하지만 이렇게 접근하면 따져야 할 조건들이 많아지게 되어 다른 방법을 찾게 됐습니다.

 

 

 

정답코드


 

white_area = [[False for _ in range(101)]for _ in range(101)] #이차원 배열 선언
N = int(input())
for _ in range(N):
    x_start,y_start = map(int,input().split())
    for i in range(x_start,x_start+10):			
        for j in range(y_start,y_start+10):
            white_area[i][j] = True				#색종이 너비에 해당하는 범위만큼을 True
# print(white_area)
black_area = 0
for i in white_area:
    black_area+=i.count(True)					#모든 색종이 너비를 count
print(black_area)

 

이렇게 이차원 배열을 선언하여 색종이의 너비만큼을 True로 대입한다면 겹치는 부분을 따로 판단할 필요 없이

True의 갯수만 확인하면 됩니다.