백준 21736번 바로가기

나의 풀이

# 입력
import sys
from collections import deque

n,m = map(int,sys.stdin.readline().split())
maps = [list(sys.stdin.readline().strip()) for _ in range(n)]
visited = [[False] * m for _ in range(n)]

dx = [0,0,1,-1]
dy = [1,-1,0,0]

# 처리
def bfs(where):
  count = 0
  i,j = where[0],where[1]
  queue = deque()
  visited[i][j] = True
  queue.append((i,j))
  
  while queue:
    i, j = queue.popleft()
    for k in range(4):
      x = i + dx[k]
      y = j + dy[k]
      if 0<=x<n and 0<=y<m and not visited[x][y]:
        if maps[x][y] != 'X':
          queue.append((x,y))
          visited[x][y] = True
          if maps[x][y] == 'P':
            count += 1
  return count

def get_index(maps, target):
  for idx1, i in enumerate(maps):
    for idx2, j in enumerate(i):
      if j == target:
        return idx1, idx2

ans = bfs(get_index(maps, 'I'))
print('TT' if ans == 0 else ans)

CODE REVIEW

  1. graph을 이용해서 탐색하는 문제. 탐색하는 과정에서 현재 queue에서 꺼낸 값이 무엇이냐에 따라서 조건을 분기시키는 것이 핵심이었다.
  2. ‘I’의 위치를 구하기 위해서 enumerate을 두 번 사용해서 위치를 파악했다. 다른 방법으로는 전체를 탐색하는 방법이 있다.
    for i in range(n):
     for j in range(m):
         if maps[i][j] == 'I':
             print(i,j)
             break