[백준] 21736번: 헌내기는 친구가 필요해 - python

삼식이·2024년 1월 31일
0

알고리즘

목록 보기
2/81

백준 21736

문제

2020년에 입학한 헌내기 도연이가 있다. 도연이는 비대면 수업 때문에 학교에 가지 못해 학교에 아는 친구가 없었다. 드디어 대면 수업을 하게 된 도연이는 어서 캠퍼스 내의 사람들과 친해지고 싶다.

도연이가 다니는 대학의 캠퍼스는 N×MN \times M 크기이며 캠퍼스에서 이동하는 방법은 벽이 아닌 상하좌우로 이동하는 것이다. 예를 들어, 도연이가 xx,
yy)에 있다면 이동할 수 있는 곳은 (x+1x+1, yy), (xx, y+1y+1),x1x-1, yy), (xx, y1y-1)이다. 단, 캠퍼스의 밖으로 이동할 수는 없다.

불쌍한 도연이를 위하여 캠퍼스에서 도연이가 만날 수 있는 사람의 수를 출력하는 프로그램을 작성해보자.

입력

첫째 줄에는 캠퍼스의 크기를 나타내는 두 정수 NN (1N6001 \leq N \leq 600), MM (1M6001 \leq M \leq 600)이 주어진다.

둘째 줄부터 NN개의 줄에는 캠퍼스의 정보들이 주어진다. 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)

0개의 댓글