2020년에 입학한 헌내기 도연이가 있다. 도연이는 비대면 수업 때문에 학교에 가지 못해 학교에 아는 친구가 없었다. 드디어 대면 수업을 하게 된 도연이는 어서 캠퍼스 내의 사람들과 친해지고 싶다.
도연이가 다니는 대학의 캠퍼스는 크기이며 캠퍼스에서 이동하는 방법은 벽이 아닌 상하좌우로 이동하는 것이다. 예를 들어, 도연이가 ,
)에 있다면 이동할 수 있는 곳은 (, ), (, ),, ), (, )이다. 단, 캠퍼스의 밖으로 이동할 수는 없다.
불쌍한 도연이를 위하여 캠퍼스에서 도연이가 만날 수 있는 사람의 수를 출력하는 프로그램을 작성해보자.
첫째 줄에는 캠퍼스의 크기를 나타내는 두 정수 (), ()이 주어진다.
둘째 줄부터 개의 줄에는 캠퍼스의 정보들이 주어진다. O는 빈 공간, X는 벽, I는 도연이, P는 사람이다. I가 한 번만 주어짐이 보장된다.
첫째 줄에 도연이가 만날 수 있는 사람의 수를 출력한다. 단, 아무도 만나지 못한 경우 TT를 출력한다.
도연이가 움직이며 P를 만나는 경우를 체크하는 것이므로 bfs의 시작점을 도연이의 위치로 지정해야한다.
따라서 도연이(I)의 위치를 먼저 구한다.
그 후 X가 아닌 곳들 중 범위를 넘어서지 않는 한에서 방문하지 않은 곳만 움직이며 그 곳에 사람(P)이 있을 경우 만난 사람 수(cnt)를 카운팅해준다.
import sys
from collections import deque
input = sys.stdin.readline
n, m = map(int, input().split())
graph = [list(input().rstrip()) for _ in range(n)]
visited = [[False]*m for _ in range(n)]
cnt = 0
for i in range(n):
for j in range(m):
if graph[i][j] == 'I':
start = (i, j)
def check(x, y):
return 0<=x<n and 0<=y<m
def bfs(start):
dx = (0,1,0,-1)
dy = (1,0,-1,0)
global cnt
x, y = start
q = deque([(x, y)])
while q:
x, y = q.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if (check(nx, ny) and graph[nx][ny] != 'X' and not visited[nx][ny]):
visited[nx][ny] = True
q.append((nx, ny))
if (graph[nx][ny] == 'P'):
cnt += 1
bfs(start)
print('TT' if cnt == 0 else cnt)