"상근이는 처음에는 빌딩의 밖에 있으며, 빌딩 가장자리의 벽이 아닌 곳을 통해 빌딩 안팎을 드나들 수 있다."라는 설명을 통해 board의 가장자리를 모두 '.'로 채워주고 H+=2; W+=2를 수행해주었다
bfs를 통해 2차원 이동을 수행하면서 max_docs_cnt를 구해주었다.
빈 공간
-> visit True로 갱신
-> queue에 노드 append
열쇠
-> keys set에 열쇠 추가
-> board '.'으로 갱신
-> queue 초기화
-> visit 초기화
-> queue에 노드 append
문
해당하는 key가 있는 경우,
-> visit True로 갱신
-> board '.'으로 갱신
-> queue에 노드 append
문서
-> max_docs_cnt 1 증가
-> visit True로 갱신
-> board '.'로 갱신
-> queue에 노드 append
import sys
from collections import deque
dx = (0, 0, -1, 1)
dy = (-1, 1, 0, 0)
def bfs(x, y):
global max_docs_cnt, keys
queue = deque([]); queue.append((x, y))
visit = [[False] * W for h in range(H)]; visit[x][y] = True
while queue:
x, y = queue.popleft()
for i in range(4):
nx = x + dx[i]; ny = y + dy[i]
if 0 <= nx < H and 0 <= ny < W:
if not visit[nx][ny]:
if board[nx][ny] == '.': #빈 공간
visit[nx][ny] = True
queue.append((nx, ny))
elif 97 <= ord(board[nx][ny]) <= 122: #열쇠 -> queue 초기화, visit 리스트 초기화
keys.add(board[nx][ny])
board[nx][ny] = '.'
queue = deque([])
visit = [[False] * W for h in range(H)]; visit[nx][ny] = True
queue.append((nx, ny))
elif 65 <= ord(board[nx][ny]) <= 90: #문
if chr(ord(board[nx][ny]) + 32) in keys:
visit[nx][ny] = True
board[nx][ny] = '.'
queue.append((nx, ny))
elif board[nx][ny] == '$': #문서
max_docs_cnt += 1
visit[nx][ny] = True
board[nx][ny] = '.'
queue.append((nx, ny))
T = int(sys.stdin.readline()[:-1])
for t in range(T):
H, W = map(int, sys.stdin.readline()[:-1].split())
board = deque([])
for h in range(H):
board.append(deque(list(sys.stdin.readline()[:-1])))
keys = set(list(sys.stdin.readline()[:-1]))
for i in range(H):
board[i].appendleft('.'); board[i].append('.')
board.appendleft(deque(['.' for w in range(W+2)])); board.append(deque(['.' for w in range(W+2)]))
H += 2; W += 2
max_docs_cnt = 0
bfs(0, 0)
print(max_docs_cnt)