Solve
[CodeTree/Python] 확산4
헨헨7
2024. 6. 17. 21:14
문제
더보기
확산 4
크기가 n x m 인 표 위에 채워져 있는 칸은 'O'로 빈칸은 ' . ' 으로 주어져 있습니다.
'O' 는 다음과 같은 속성을 가집니다.
- 3초가 지나게 되면 자신을 포함한 상하좌우 5개의 칸을 빈칸으로 만듭니다.
또, 'O'는 다음과 같은 규칙으로 생기게 됩니다.
- 초기 1초를 제외하고, 모든 빈칸에 'O'가 생깁니다.
s초 후에 표의 상태를 구하는 프로그램을 작성해보세요.
입력 형식
첫 번째 줄에 n, m, s가 주어집니다.
두 번째 줄부터 n개의 줄에 걸쳐 ' . ' 또는 'O' 이 m개씩 공백없이 주어집니다.
- 1 ≤ n, m, s ≤ 200
출력 형식
s초 후의 표의 상태를 n개의 줄에 걸쳐 출력합니다.
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
해결
# %2 == 0 : 모두 O
# 3초 후 부터 +3 단위(3, 7, 11 ...)
# 5초 후 부터 +3 단위(5, 9, 13 ...)
from collections import deque
n, m, s = map(int, input().split())
graph = [list(map(str, input())) for _ in range(n)]
def simulate(n, m, s, graph):
if s == 1:
return graph
elif s % 2 == 0:
return [['O'] * m for _ in range(n)]
def bfs(graph):
Q = deque()
# 방문 리스트 초기화
for i in range(n):
for j in range(m):
if graph[i][j] == 'O':
Q.append((i, j))
dx = [-1, 0, 1, 0] # 북쪽부터 시계방향
dy = [0, 1, 0, -1]
fin_graph = [['O'] * m for _ in range(n)]
while Q:
x, y = Q.popleft()
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if 0 <= nx < n and 0 <= ny < m:
fin_graph[x][y] = '.'
fin_graph[nx][ny] = '.'
return fin_graph
three_seconds = bfs(graph)
five_seconds = bfs(three_seconds)
return three_seconds if s % 4 == 3 else five_seconds
ans = simulate(n, m, s, graph)
for i in range(n):
for j in range(m):
print(ans[i][j], end = '')
print()
BFS + 시간 흐름에 따른 변화를 구현해야 하는 문제이다. 출력 결과와 조건을 확인하고 다음을 고려하여 작성하였다.
- 2초 단위, 3초 단위, 5초 단위(3초부터 +3초이므로) 3가지로 케이스를 분리한다.
- 큐를 생성하여 'O'인 경우 좌표를 큐에 넣는다.
- 3초 단위부터 BFS를 돌아야 하므로, 2초의 전체가 'O'인 경우에 대한 그래프를 생성한다.
- 큐에서 인접 리스트를 돌면서 자기 자신을 포함하여 '.'로 변경한다.
- 3초 단위 케이스에서는 초기 그래프에서 BFS를 실행하고, 5초 단위는 3초 단위 케이스에서 새로운 BFS를 진행한다.
(tmi)