-
[DFS/BFS] BOJ 18405 ๊ฒฝ์์ ์ ์ผAlgorithms in Python/baekjoon 2021. 2. 1. 13:32
๐ ๋ฐฑ์ค 18405 ๊ฒฝ์์ ์ ์ผ
โ ๋ฌธ์ ์ ํต์ฌ, ํ์ด ๊ณผ์
• ๋ฐ์ด๋ฌ์ค๋ 1์ด๋ง๋ค ์ํ์ข์ฐ ๋ฐฉํฅ์ผ๋ก ์ฆ์ํด ๋๊ฐ๋ค. ๋ํ ์ด๋ค ํน์ ์นธ์ ์ด๋ ํ ๋ฐ์ด๋ฌ์ค๊ฐ ์กด์ฌํ๋ฉด, ๊ทธ ๊ณณ์๋ ๋ฐ์ด๋ฌ์ค๊ฐ ๋ค์ด๊ฐ ์ ์๋ค.
=> ์ ํ์ ์ธ bfs ๋ฌธ์ ์ด๋ค. ์ด๊ธฐ graph๋ฅผ 0์ผ๋ก ์ค์ ํ๊ณ ๋ฐ์ด๋ฌ์ค๊ฐ ์๊ฑฐ๋ ๋ฒ์ง ๊ฒฝ์ฐ graph๋ฅผ ๊ทธ ๋ฐ์ด๋ฌ์ค๋ก ๋ณ๊ฒฝ์ํจ๋ค.
• ๋งค ์ด๋ง๋ค ๋ฒํธ๊ฐ ๋ฎ์ ์ข ๋ฅ์ ๋ฐ์ด๋ฌ์ค๋ถํฐ ๋จผ์ ์ฆ์ํ๋ค.
=> ์ฒ์ bfs๋ฅผ ์งํํ ๋, ๋ฒํธ๊ฐ ๋ฎ์ ์ข ๋ฅ์ ๋ฐ์ด๋ฌ์ค๋ถํฐ ํ์ ๋ฃ๊ณ ์์ํด์ผ ํ๋ค.
- graph[i][j]์ i, j๋ฅผ ๋ด์ ๋ฐฐ์ด์ ์ ๋ ฌํ์ฌ ํ์ ๋ฃ๋๋ค.
• ์ํ๊ด์ ํฌ๊ธฐ์ ๋ฐ์ด๋ฌ์ค์ ์์น ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, S์ด๊ฐ ์ง๋ ํ์ (X,Y)์ ์กด์ฌํ๋ ๋ฐ์ด๋ฌ์ค์ ์ข ๋ฅ๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๋ง์ฝ S์ด ๋ค์ ํด๋น ์์น์ ๋ฐ์ด๋ฌ์ค๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด, 0์ ์ถ๋ ฅํ๋ค.
=> ๊ฐ ์์น์ ์ด๋ฅผ ์ ์ฅํ second ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด ๋ฐ์ด๋ฌ์ค๊ฐ ์ฆ์ ํ ๋๋ง๋ค ์ด๋ฅผ ์ฆ๊ฐ์ํจ๋ค.
โ ์ ์ฒด ์ฝ๋
import sys from collections import deque input = sys.stdin.readline n, k = map(int, input().split()) graph = [[0] * n for _ in range(n)] second = [[0] * n for _ in range(n)] dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1] start = [] for i in range(n): graph[i] = list(map(int, input().split())) for j in range(n): if graph[i][j] != 0: start.append((graph[i][j], i, j)) s, target_x, target_y = map(int, input().split()) # ๋ฒํธ๊ฐ ๋ฎ์ ์ข ๋ฅ๋ถํฐ ์ฆ์, ํ์ ๋ฎ์ ๋ฒํธ๋ถํฐ ์ฝ์ ํ๊ณ ์์ํด์ผ ํ๋ค start.sort() queue = deque(start) while queue: virus, x, y = queue.popleft() if second[x][y] == s: break for i in range(4): nx = x + dx[i] ny = y + dy[i] if nx < 0 or nx >= n or ny < 0 or ny >= n: continue if graph[nx][ny] == 0: graph[nx][ny] = virus second[nx][ny] = second[x][y] + 1 queue.append((virus, nx, ny)) print(graph[target_x-1][target_y-1])
'Algorithms in Python > baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Prefix Sum] BOJ 20002 ์ฌ๊ณผ๋๋ฌด (0) 2021.02.03 [Sliding Window] BOJ 10025 ๊ฒ์ผ๋ฅธ ๋ฐฑ๊ณฐ (0) 2021.02.03 [DFS/BFS] BOJ 16234 ์ธ๊ตฌ ์ด๋ (0) 2021.02.01 [Binary Search] BOJ 2470 ๋ ์ฉ์ก (0) 2021.01.27 [Binary Search] BOJ 2110 ๊ณต์ ๊ธฐ ์ค์น (0) 2021.01.24