-
[Python] ๋ฐฑ์ค 1012 ์ ๊ธฐ๋ ๋ฐฐ์ถ (BFS)๐ป Algorithm/Python 2022. 7. 8. 19:44
๐ ๋ฌธ์
์ฐจ์ธ๋ ์๋์ธ ํ๋๋ ๊ฐ์๋ ๊ณ ๋ญ์ง์์ ์ ๊ธฐ๋ ๋ฐฐ์ถ๋ฅผ ์ฌ๋ฐฐํ๊ธฐ๋ก ํ์๋ค. ๋์ฝ์ ์ฐ์ง ์๊ณ ๋ฐฐ์ถ๋ฅผ ์ฌ๋ฐฐํ๋ ค๋ฉด ๋ฐฐ์ถ๋ฅผ ํด์ถฉ์ผ๋ก๋ถํฐ ๋ณดํธํ๋ ๊ฒ์ด ์ค์ํ๊ธฐ ๋๋ฌธ์, ํ๋๋ ํด์ถฉ ๋ฐฉ์ง์ ํจ๊ณผ์ ์ธ ๋ฐฐ์ถํฐ์ง๋ ์ด๋ฅผ ๊ตฌ์ ํ๊ธฐ๋ก ๊ฒฐ์ฌํ๋ค. ์ด ์ง๋ ์ด๋ ๋ฐฐ์ถ๊ทผ์ฒ์ ์์ํ๋ฉฐ ํด์ถฉ์ ์ก์ ๋จน์์ผ๋ก์จ ๋ฐฐ์ถ๋ฅผ ๋ณดํธํ๋ค. ํนํ, ์ด๋ค ๋ฐฐ์ถ์ ๋ฐฐ์ถํฐ์ง๋ ์ด๊ฐ ํ ๋ง๋ฆฌ๋ผ๋ ์ด๊ณ ์์ผ๋ฉด ์ด ์ง๋ ์ด๋ ์ธ์ ํ ๋ค๋ฅธ ๋ฐฐ์ถ๋ก ์ด๋ํ ์ ์์ด, ๊ทธ ๋ฐฐ์ถ๋ค ์ญ์ ํด์ถฉ์ผ๋ก๋ถํฐ ๋ณดํธ๋ฐ์ ์ ์๋ค. ํ ๋ฐฐ์ถ์ ์ํ์ข์ฐ ๋ค ๋ฐฉํฅ์ ๋ค๋ฅธ ๋ฐฐ์ถ๊ฐ ์์นํ ๊ฒฝ์ฐ์ ์๋ก ์ธ์ ํด์๋ ๊ฒ์ด๋ค.
ํ๋๊ฐ ๋ฐฐ์ถ๋ฅผ ์ฌ๋ฐฐํ๋ ๋ ์ ๊ณ ๋ฅด์ง ๋ชปํด์ ๋ฐฐ์ถ๋ฅผ ๊ตฐ๋ฐ๊ตฐ๋ฐ ์ฌ์ด ๋์๋ค. ๋ฐฐ์ถ๋ค์ด ๋ชจ์ฌ์๋ ๊ณณ์๋ ๋ฐฐ์ถํฐ์ง๋ ์ด๊ฐ ํ ๋ง๋ฆฌ๋ง ์์ผ๋ฉด ๋๋ฏ๋ก ์๋ก ์ธ์ ํด์๋ ๋ฐฐ์ถ๋ค์ด ๋ช ๊ตฐ๋ฐ์ ํผ์ ธ์๋์ง ์กฐ์ฌํ๋ฉด ์ด ๋ช ๋ง๋ฆฌ์ ์ง๋ ์ด๊ฐ ํ์ํ์ง ์ ์ ์๋ค. ์๋ฅผ ๋ค์ด ๋ฐฐ์ถ๋ฐญ์ด ์๋์ ๊ฐ์ด ๊ตฌ์ฑ๋์ด ์์ผ๋ฉด ์ต์ 5๋ง๋ฆฌ์ ๋ฐฐ์ถํฐ์ง๋ ์ด๊ฐ ํ์ํ๋ค. 0์ ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ ธ ์์ง ์์ ๋ ์ด๊ณ , 1์ ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ ธ ์๋ ๋ ์ ๋ํ๋ธ๋ค.
์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ ์ค์๋ ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ ์ค๋ถํฐ ๊ฐ๊ฐ์ ํ ์คํธ ์ผ์ด์ค์ ๋ํด ์ฒซ์งธ ์ค์๋ ๋ฐฐ์ถ๋ฅผ ์ฌ์ ๋ฐฐ์ถ๋ฐญ์ ๊ฐ๋ก๊ธธ์ด M(1 ≤ M ≤ 50)๊ณผ ์ธ๋ก๊ธธ์ด N(1 ≤ N ≤ 50), ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ ธ ์๋ ์์น์ ๊ฐ์ K(1 ≤ K ≤ 2500)์ด ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ K์ค์๋ ๋ฐฐ์ถ์ ์์น X(0 ≤ X ≤ M-1), Y(0 ≤ Y ≤ N-1)๊ฐ ์ฃผ์ด์ง๋ค. ๋ ๋ฐฐ์ถ์ ์์น๊ฐ ๊ฐ์ ๊ฒฝ์ฐ๋ ์๋ค.
์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค์ ๋ํด ํ์ํ ์ต์์ ๋ฐฐ์ถํฐ์ง๋ ์ด ๋ง๋ฆฌ ์๋ฅผ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ 1
2
10 8 17
0 0
1 0
1 1
4 2
4 3
4 5
2 4
3 4
7 4
8 4
9 4
7 5
8 5
9 5
7 6
8 6
9 6
10 10 1
5 5์์ ์ถ๋ ฅ 1
5
1์์ ์ ๋ ฅ 2
1
5 3 6
0 2
1 2
2 2
3 2
4 2
4 0์์ ์ถ๋ ฅ 2
2
๐ ํ์ด
๐ฌ Code
import sys from collections import deque input = sys.stdin.readline def bfs(x, y): q = deque([(x, y)]) while q: x, y = q.popleft() for i in range(4): nx = x + dx[i] ny = y + dy[i] if 0 <= nx < n and 0 <= ny < m and graph[nx][ny] == 1: q.append((nx, ny)) graph[nx][ny] = 2 return 1 for _ in range(int(input())): m, n, k = map(int, input().split()) graph = [[0 for _ in range(m)] for _ in range(n)] dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1] for i in range(k): a, b = map(int, input().split()) graph[b][a] = 1 cnt = 0 for i in range(n): for j in range(m): if graph[i][j] == 1: cnt += bfs(i, j) print(cnt)
๐ก Solution
cnt = 0 for i in range(n): for j in range(m): if graph[i][j] == 1: cnt += bfs(i, j)
๋ฐฐ์ถ๊ฐ ์ฌ์ด์ง ๊ณณ์์ bfs๋ฅผ ์ํํฉ๋๋ค. bfs๋ ์ธ์ ํ ๋ฐฐ์ถ๋ฅผ ๋ค ์ฒดํฌํ๊ณ 1์ ๋ฐํํ๋๋ก ์ค๊ณ๋์ด ์์ด์, cnt += bfs(i, j)๋ ๋ฐฐ์ถ๊ตฌ์ญ ํ๋๋ฅผ ์ฒดํฌํ ๋๋ง๋ค ์ง๋ ์ด ํ ๋ง๋ฆฌ๋ฅผ ๋ํ๋ ์ญํ ์ ํฉ๋๋ค.
def bfs(x, y): q = deque([(x, y)]) while q: x, y = q.popleft() for i in range(4): nx = x + dx[i] ny = y + dy[i] if 0 <= nx < n and 0 <= ny < m and graph[nx][ny] == 1: q.append((nx, ny)) graph[nx][ny] = 2 return 1
๋ฐฐ์ถ ์ขํ (x, y)๊ฐ ์ฃผ์ด์ง๋ฉด ํด๋น ๋ฐฐ์ถ์ ์ธ์ ํ ๋ฐฐ์ถ๋ฅผ ์ดํด๋ด์ผ ํฉ๋๋ค. ๋ฐฉํฅ๋ฒกํฐ๋ก ์ํ์ข์ฐ์ ๋ค ์์น๋ก ์ด๋ํ๊ธฐ ์ํด for๋ฌธ์ ๋ค ๋ฒ ๋๋ฆฝ๋๋ค. (nx, ny)๋ ํด๋น ๋ฐฉํฅ์ผ๋ก ํ ์นธ ์ด๋ํ ์ขํ์ ๋๋ค. (nx, ny)๊ฐ ์ขํ๊ณ๋ฅผ ๋ฒ์ด๋์ง ์์์๊ณผ ๋์์ ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ง ์ขํ๋ผ๋ฉด ์ด ์ขํ์ ์ธ์ ๋ฐฐ์ถ๋ฅผ ๋ ํ์ํ๊ธฐ ์ํด ํ์ ๋ฃ์ต๋๋ค. ๋ง์ง๋ง์ผ๋ก (nx, ny)๋ฅผ ์ฒดํฌํ๋ค๋ ๋ป์์ ์ขํ๊ฐ์ 2๋ก ๋ณ๊ฒฝํฉ๋๋ค.
bfs๊ฐ ํ ๋ฒ ๋๋๋ฉด ์์์ขํ์ ์ธ์ ํ ๋ฐฐ์ถ๋ค์ ์ขํ๊ฐ์๋ ๋ชจ๋ 2๊ฐ ๋ฎ์ด์์์ง๊ณ , ๊ตฌ์ญ 1๊ฐ๋ฅผ ๋ค ์ดํด๋ณด์๋ค๋ ์๋ฏธ๋ก 1์ ๋ฐํํฉ๋๋ค.
'๐ป Algorithm > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] ๋ฐฑ์ค 16719 ZOAC (๊ตฌํ) (0) 2022.07.08 [Python] ๋ฐฑ์ค 1541 ์์ด๋ฒ๋ฆฐ ๊ดํธ (Greedy) (0) 2022.07.08 [Python] ๋ฐฑ์ค 16206 ๋กค์ผ์ดํฌ (Greedy) (0) 2022.07.08 [Python] ๋ฐฑ์ค 4358 ์ํํ (Counter) (0) 2022.07.08 [Python] ๋ฐฑ์ค 19637 IF๋ฌธ ์ข ๋์ ์จ์ค (Binary Search) (0) 2022.07.08