import sys
from collections import deque, defaultdict
input = sys.stdin.readline
'''
우선 bfs 탐색을 할거임
하지만 여기서 while queue가 아닌 S의 숫자만큼 반복 -> index로 판별하면 될듯
2중 queue를 사용하면 될것같음! + key값을 index로 둬도 좋을듯
각 플레이어의 위치를 2차원 queue에 저장 ex) [{i : [(1, 2), (3, 4)]}, {i : [(5,5]}]
여기서 queue에 있는 queue를 하나 빼오고 이걸로 탐색 시작
while True가 아닌 for i in range(S[index])
자잘한 조건 붙여서 확장
반복이 끝나면 queue의 최종 형태를 globalQueue에 append (queue가 비어있으면 pass)
global
최초 전체 플레이어의 위치를 저장할 queue(dict(queue()))
graph
local
key값
그냥 평범한 bfs에 필요한것들
'''
dy = [-1, 1, 0, 0]
dx = [0, 0, -1, 1]
def bfs():
while globalQueue:
curDict = globalQueue.popleft()
curKey = list(curDict.keys())[0]
curQueue = curDict[curKey]
if curQueue:
for _ in range(S[curKey]):
tmpQueue = deque()
while curQueue:
curY, curX = curQueue.popleft()
for i in range(4):
newY, newX = curY + dy[i], curX + dx[i]
if 0 <= newY < N and 0 <= newX < M and graph[newY][newX] == ".":
graph[newY][newX] = str(curKey)
tmpQueue.append((newY, newX))
curQueue = tmpQueue
globalQueue.append({curKey:curQueue})
N, M, P = map(int, input().split())
S = [0] + list(map(int, input().split()))
graph = [list(input().rstrip()) for _ in range(N)]
globalQueue = deque()
positions = defaultdict(deque)
for p in range(1, P+1):
for i in range(N):
for j in range(M):
if graph[i][j] == str(p):
positions[p].append((i, j))
globalQueue.append({p : positions[p]})
bfs()
for result in range(1, P+1):
count = 0
for i in graph:
for j in i:
if j == str(result):
count += 1
print(count, end=" ")
pypy3 턱걸이 통과..
좀 더 로직을 간결화 할 필요가 있어보인다.
'코딩딩 > BOJ' 카테고리의 다른 글
[백준9205번 맥주 마시면서 걸어가기] 문제풀이 (0) | 2024.08.03 |
---|---|
[백준 14442번 벽 부수고 이동하기] 문제풀이 (0) | 2024.08.03 |
[백준 1600번 말이 되고픈 원숭이] 문제풀이 (0) | 2024.07.30 |
[백준 16236번 아기상어] 문제풀이 (1) | 2024.07.30 |
1715 - 카드 정렬하기 (0) | 2024.04.24 |