PS/코드트리
[BFS] 상한 귤
행복한라이언
2024. 2. 11. 13:57
728x90
반응형
[문제그림]
문제링크
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
1. 핵심
- 유형: BFS 유형 중 출발점이 2개 이상인 BFS
- 상한 귤(2) 가 일반 귤(1)을 상하게 한다는 점!!
- 상한귤(2)을 시작점으로 bfs 시작
- 귤이 상하면 기존에 일반 귤(1) 이 상한 귤(2)로 변경됨!
- 거의 같은 문제
https://www.acmicpc.net/problem/7576
7576번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토
www.acmicpc.net
2. 코드(Python)
# 백준 - 토마토 문제와 비슷한거같음..
from collections import deque
inf = int(1e9)
n, k = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
dr = [-1, 1, 0, 0]
dc = [0, 0, -1, 1]
def in_range(r, c):
return 0 <= r < n and 0 <= c < n
# 상한 귤 찾기!
def find(board):
starts = []
for r in range(n):
for c in range(n):
if board[r][c] == 2:
starts.append((r, c))
return starts
# 상한 귤들을 먼저 처리
# 핵심! 귤이 상하면 1 -> 2로 변경된다!!
def bfs(starts):
dq = deque([])
in_queue = [[False for _ in range(n)] for _ in range(n)]
visited = [[0 for _ in range(n)] for _ in range(n)]
for r, c in starts:
dq.append((r, c))
in_queue[r][c] = True
while dq:
cr, cc = dq.popleft()
for dir in range(4):
nr = cr + dr[dir]
nc = cc + dc[dir]
if in_range(nr, nc) and not in_queue[nr][nc] and board[nr][nc] == 1:
dq.append((nr, nc))
board[nr][nc] = 2 # 귤이 상함 1 > 2
in_queue[nr][nc] = True
visited[nr][nc] = visited[cr][cc] + 1
for r in range(n):
for c in range(n):
# 귤이 없었네요~
if board[r][c] == 0:
visited[r][c] = -1
# 귤이 있는데(1) & 방문하지 않음(상하지않음)
elif board[r][c] == 1 and visited[r][c] == 0:
visited[r][c] = -2
for row in visited:
print(*row)
starts = find(board)
bfs(starts)
728x90
반응형