ProblemSolving/BOJ

[백준] 27211번 - 도넛 행성 (Python, 파이썬)

적절 2023. 1. 19. 01:32
반응형

문제

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

 

27211번: 도넛 행성

준겸이는 $N \times M$칸으로 이루어진 도넛 모양의 행성에 살고 있다. 준겸이가 살고 있는 행성에는 위 그림처럼 격자 모양으로 줄이 그어져 있다. 행성의 각 칸은 숲으로 막혀 있거나, 지나갈 수

www.acmicpc.net

 

접근 방법

BFS 또는 DFS를 이용하여 풀면 된다.

아직 방문하지 않은 곳 하나를 찾고 이를 기준으로 막혀있지 않은 다른 인접 구역들을 모두 방문하면 이들을 다 합쳐 하나의 구역이 된다.

이후 방문하지 않은 다른 곳을 하나 찾아 이러한 과정을 반복하면 된다.

양쪽 끝이 연결되어 있다는 특이점이 있는데, arr[i][j]에 접근하는 대신 arr[i % N][j % M]으로 접근하도록 하면 (0, M-1) 오른쪽이 (0, 0), (0, 0) 왼쪽이 (0, M-1)이 되므로 자연스럽게 해결된다. (위/아래도 마찬가지)

 

코드

import sys
from collections import deque

N, M = map(int, sys.stdin.readline().rstrip().split())
mapArr = []
for i in range(N):
    mapArr.append(list(map(int, sys.stdin.readline().rstrip().split())))

dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
answer = 0
for i in range(N):
    for j in range(M):
        if mapArr[i][j] == 0: # 빈 구역을 찾으면 1로 칠하고 인접한 구역 모두 1로 칠함
            answer += 1
            
            tempQueue = deque()
            tempQueue.append((i, j))
            mapArr[i][j] = 1
            
            while tempQueue:
                currentI, currentJ = tempQueue.popleft()
                for x in range(len(dx)):
                    nextI = currentI + dx[x]
                    nextJ = currentJ + dy[x]
                    
                    if mapArr[nextI % N][nextJ % M] == 0:
                        mapArr[nextI % N][nextJ % M] = 1
                        tempQueue.append((nextI % N, nextJ % M))

print(answer)

 

반응형