여니의 취준 준비/코딩테스트 (Python)

[n2567] 색종이2 - 파이썬

여니's 2021. 9. 23. 10:49

https://www.acmicpc.net/problem/2567

 

2567번: 색종이 - 2

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

www.acmicpc.net

(문제)

검은색 영역의 둘레 길이를 구하는 문제

 


(처음 생각)

겹치는 구간은 생각하지 못해서 헤맸다

처음에 생각해냈던 풀이는 검은 상자 전체를 감싸는 사각형의 둘레를 구하는 건줄 알았음.

(문제를 제대로 읽자!)


(풀이)

일단 상자에 해당하는 공간들을 1로 채운다.

배열은 101 X 101

> 100으로 하지 않는 이유? 상하좌우를 파악할 때 인덱스 범위 밖으로 벗어나는 걸 미리 방지하기 위함

 

1로 상자 체크 하는 걸 생각해내지 못했음.

둘레를 구할 때 배열을 이용하여 이런식으로 해결하는 방식을 한 번 떠올려보도록 노력할 것. 

 

 

모서리

모서리 일땐 2를 더해줘야 한다.

 

상하좌우 중 1개가 0이면, cnt==1이면 result+=1

 

 

num = int(input())
array = [[0 for _ in range(101)] for _ in range(101)]
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

# map
for _ in range(num):
    x, y = map(int, input().split())
    for i in range(x, x + 10):
        for j in range(y, y + 10):
            array[i][j] = 1

result = 0

for i in range(1,101):
    for j in range(1,101):
        if array[i][j] == 1:
            cnt = 0
            for k in range(4):
                nx = i + dx[k]
                ny = j + dy[k]
                if array[nx][ny] == 1:
                    cnt += 1
            if cnt == 3: # 상하좌우 중 3칸이 1로 채워져있으면
                result += 1
            elif cnt == 2: # 상자 각종 모서리에 해당, 둘레를 구하는 것이기 때문에 +2를 해줘야한다.
                result += 2

print(result)