Notion에서 작성한 글이라, 여기에서 더 깔끔하게 보실 수 있습니다! 😮😊
0
또는 1
개수까지 하나하나 체크해본다면 어떻게 해볼 수도 있을 것 같았지만 너무 복잡해 보여서 다른 방법을 고민해 봤다.0
과 1
이 맞닿는 부분의 개수를 세어주면 되는 문제로 바뀌었다. 여기에서 추가로 생각할 점이 두 가지 있다. Point 1. 지도의 위, 아래, 왼쪽, 오른쪽 끝에 건물이 위치한 경우, 그 벽의 개수를 어떻게 세어줄 수 있을지 Point 2. 건물 내부에 빈 공간이 있는 경우 이 벽에는 조명을 장식하지 않는데, 이 부분 또한 0
과 1
이 맞닿는 부분이라, 이를 어떻게 해결할지0
으로 둘러준 다음 BFS1
로 둘러쌓여있는지 로 체크해주고 빼야 하나…? 그런데 빈 공간 내부에서 또 BFS를 돌려서 빼야 할 것 같다!0
과 1
이 맞닿는 부분이기 때문에, 0
을 기준으로 BFS를 돌리고, 1
인 부분의 값을 변경하지만 않으면 자연스럽게 외벽만 고려할 수 있겠다!0
으로 둘러준 다음 BFS import sys
input = sys.stdin.readline
from collections import deque
def bfs(i, j):
queue = deque([(i, j)])
hexa[i][j] = 2
cnt = 0
delta = (((0, -1), (0, 1), (-1, -1), (-1, 0), (1, -1), (1, 0)),
((0, -1), (0, 1), (-1, 0), (-1, 1), (1, 0), (1, 1)))
while queue:
y, x = queue.popleft()
for dy, dx in delta[y%2]:
ny, nx = y+dy, x+dx
if 0<=ny<h+2 and 0<=nx<w+2 and hexa[ny][nx] <= 1:
if hexa[ny][nx] == 1:
cnt += 1
else:
hexa[ny][nx] = 2
queue.append((ny, nx))
return cnt
w, h = map(int, input().split())
hexa = [[0]*(w+2)] + [[0]+[*map(int, input().split())]+[0] for _ in range(h)] + [[0]*(w+2)]
print(bfs(0, 0))
1
인 경우 이는 벽에 해당하므로 cnt
를 증가시킨다.0
인 경우 방문처리를 위해 2
로 바꿔준다. (숫자 2
가 갖는 의미는 방문했다는 의미 외에 다른 의미를 갖지 않는다. visited와 같은 방문처리용 리스트를 사용하지 않아 메모리를 절약하기 위함이다!)