๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/1012)
<์ ๊ธฐ๋ ๋ฐฐ์ถ>
๋ฌธ์
์ฐจ์ธ๋ ์๋์ธ ํ๋๋ ๊ฐ์๋ ๊ณ ๋ญ์ง์์ ์ ๊ธฐ๋ ๋ฐฐ์ถ๋ฅผ ์ฌ๋ฐฐํ๊ธฐ๋ก ํ์๋ค. ๋์ฝ์ ์ฐ์ง ์๊ณ ๋ฐฐ์ถ๋ฅผ ์ฌ๋ฐฐํ๋ ค๋ฉด ๋ฐฐ์ถ๋ฅผ ํด์ถฉ์ผ๋ก๋ถํฐ ๋ณดํธํ๋ ๊ฒ์ด ์ค์ํ๊ธฐ ๋๋ฌธ์, ํ๋๋ ํด์ถฉ ๋ฐฉ์ง์ ํจ๊ณผ์ ์ธ ๋ฐฐ์ถ ํฐ ์ง๋ ์ด๋ฅผ ๊ตฌ์ ํ๊ธฐ๋ก ๊ฒฐ์ฌํ๋ค. ์ด ์ง๋ ์ด๋ ๋ฐฐ์ถ ๊ทผ์ฒ์ ์์ํ๋ฉฐ ํด์ถฉ์ ์ก์๋จน์์ผ๋ก์จ ๋ฐฐ์ถ๋ฅผ ๋ณดํธํ๋ค. ํนํ, ์ด๋ค ๋ฐฐ์ถ์ ๋ฐฐ์ถ ํฐ ์ง๋ ์ด๊ฐ ํ ๋ง๋ฆฌ๋ผ๋ ์ด๊ณ ์์ผ๋ฉด ์ด ์ง๋ ์ด๋ ์ธ์ ํ ๋ค๋ฅธ ๋ฐฐ์ถ๋ก ์ด๋ํ ์ ์์ด, ๊ทธ ๋ฐฐ์ถ๋ค ์ญ์ ํด์ถฉ์ผ๋ก๋ถํฐ ๋ณดํธ๋ฐ์ ์ ์๋ค. ํ ๋ฐฐ์ถ์ ์ํ์ข์ฐ ๋ค ๋ฐฉํฅ์ ๋ค๋ฅธ ๋ฐฐ์ถ๊ฐ ์์นํ ๊ฒฝ์ฐ์ ์๋ก ์ธ์ ํด์๋ ๊ฒ์ด๋ค.
ํ๋๊ฐ ๋ฐฐ์ถ๋ฅผ ์ฌ๋ฐฐํ๋ ๋ ์ ๊ณ ๋ฅด์ง ๋ชปํด์ ๋ฐฐ์ถ๋ฅผ ๊ตฐ๋ฐ๊ตฐ๋ฐ ์ฌ์ด ๋์๋ค. ๋ฐฐ์ถ๋ค์ด ๋ชจ์ฌ์๋ ๊ณณ์๋ ๋ฐฐ์ถ ํฐ ์ง๋ ์ด๊ฐ ํ ๋ง๋ฆฌ๋ง ์์ผ๋ฉด ๋๋ฏ๋ก ์๋ก ์ธ์ ํด์๋ ๋ฐฐ์ถ๋ค์ด ๋ช ๊ตฐ๋ฐ์ ํผ์ ธ์๋์ง ์กฐ์ฌํ๋ฉด ์ด ๋ช ๋ง๋ฆฌ์ ์ง๋ ์ด๊ฐ ํ์ํ์ง ์ ์ ์๋ค. ์๋ฅผ ๋ค์ด ๋ฐฐ์ถ๋ฐญ์ด ์๋์ ๊ฐ์ด ๊ตฌ์ฑ๋์ด ์์ผ๋ฉด ์ต์ 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)๊ฐ ์ฃผ์ด์ง๋ค. ๋ ๋ฐฐ์ถ์ ์์น๊ฐ ๊ฐ์ ๊ฒฝ์ฐ๋ ์๋ค.
์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค์ ๋ํด ํ์ํ ์ต์์ ๋ฐฐ์ถ ํฐ ์ง๋ ์ด ๋ง๋ฆฌ ์๋ฅผ ์ถ๋ ฅํ๋ค.
๋ฌธ์ ํ์ด
- my solution
import sys
from collections import deque
def bfs(graph,start,visited,m,n): #๋๋น ์ฐ์ ํ์
dx=[-1,0,0,1] #์์ข์ฐํ
dy=[0,-1,1,0]
temp=deque([start])
while temp:
k=temp.popleft()
visited.append(k) # ๋ฐฉ๋ฌธํ๋ฉด
for i in range(4):
x=k[0]+dx[i]
y=k[1]+dy[i]
if x>=0 and x<m and y>=0 and y<n: # ๋ฒ์ ํ์ธ
if [x,y] in graph and [x,y] not in visited: # ๋ฐฐ์ถ๊ฐ ์๊ณ ์์ง ๋ฐฉ๋ฌธํ์ง ์์์ผ๋ฉด
graph.remove([x,y]) # ๋ฐฉ๋ฌธํ ๊ฒ์ด๋ฏ๋ก main์์ ๋ฐ๋ณต๋ฌธ ๋ ํ์ ์์
temp.append([x,y])
if __name__=='__main__':
t=int(input()) # ํ
์คํธ ์ผ์ด์ค
for i in range(t):
m,n,k=map(int,sys.stdin.readline().split())
visited=[]
arr=[]
for i in range(k): # ๋ฐฐ์ถ ์์น
x=list(map(int, sys.stdin.readline().split()))
arr.append(x)
cnt=0
for i in arr:
if i not in visited: # ์์ง ๋ฐฉ๋ฌธํ์ง ์์์ผ๋ฉด
cnt+=1
bfs(arr,i,visited,m,n)
print(cnt)
bfs์ ๋ํด์ ์ฐพ์๋ณด๋ค๊ฐ deque์ popleft๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ธ์ ๋ณด๊ณ ์ฌ๊ธฐ์ ํ์ฉํด๋ณด์๋ค. ๋ญ๊ฐ ๋ง๋์ง ์ ๋ง ๋ชจ๋ฅด๊ฒ ๋ค. ์กฐ๋ง๊ฐ ์ฑ ์ ์ฐพ์์ ํ์ธํด๋ด์ผ๊ฒ ๋ค!
- bfs(list, ์์ ์์น , ๋ฐฉ๋ฌธ ์ฌ๋ถ list, ๋ฐฐ์ถ ๋ฐญ์ ๊ฐ๋ก๊ธธ์ด, ๋ฐฐ์ถ ๋ฐญ์ ์ธ๋ก ๊ธธ์ด)
- ์ฐ๊ฒฐ๋ ๋ถ๋ถ์ ์ฐพ์์ผ ํ๊ธฐ ๋๋ฌธ์ ์์ข์ฐํ๋ฅผ ๋ณด๊ธฐ ์ํด dx, dy ์ ์ธ
- temp deque์ ์์ ์์น x, y ์ขํ ๋ฃ์ด์ ์ ์ธ
- temp list๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต: temp์์ ๋งจ ์ ๊ฐ์ ๋ฝ์์ ์์ง ๋ฐฉ๋ฌธํ ์ง์ด ์๋๋ผ๋ฉด visited์ ํ์, ์์ข์ฐํ ํ์ธํ์ฌ ๋ฐฐ์ถ ๋ฐญ์ ๊ฐ๋ก, ์ธ๋ก ๋ฒ์์ ์ํ๊ณ , ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด ๋ฐฐ์ถ ์์น list์์ ์ ๊ฑฐ์ temp list์ x, y ์ขํ ์ถ๊ฐ - main
- ํ ์คํธ ์ผ์ด์ค ์ ์ ๋ ฅ
- ๋ฐฐ์ถ ๋ฐญ์ ๊ฐ๋ก, ์ธ๋ก ๊ธธ์ด์ ๋ฐฐ์ถ ์์น ๊ฐ์ ์ ๋ ฅ
- ๋ฐฐ์ถ ์์น ์ ๋ ฅ
- ๋ฐฐ์ถ ์์น ์ํํ๋ฉฐ ์์ง ๋ฐฉ๋ฌธํ์ง ์์์ผ๋ฉด bfs ํธ์ถ -> ํธ์ถํ ๋๋ง๋ค ๋ฐฐ์ถ ํฐ ์ง๋ ์ด ํ์ +1
์ฒ์์ ๋ฌธ์ ๋ฅผ ์ ํผ ๊ฒ ๊ฐ์๋๋ฐ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ์ฌ ์ ์ ์ ์์๋ ๋ฌธ์ ์ด๋ค.
์ค๋ ๋ค์ ์ฝ๋๋ฅผ ๋ณด๋ฉฐ ์๊ฐ ์ด๊ณผ๊ฐ ๋ ์ด์ ๋ฅผ ์ดํด๋ณด๋ค๊ฐ ๋ฑ ํ ์ค์ ์ถ๊ฐํ๋ ํต๊ณผํ ์ ์์๋ค.
์๊ฐ ์ด๊ณผ ์ด์ :
ํ ๋ฐฐ์ถ ์์น์์ ์ํ์ข์ฐ๋ฅผ ์ดํด๋ดค์ ๋ ๋ฐฐ์ถ๊ฐ ์กด์ฌํ๋ค๋ฉด ๊ทธ ๋ฐฐ์ถ๋ก ์ด๋ํ์ฌ ๊ณ์ํด์ ํ์ํ ๊ฒ์ด๋ค.
main๋ฌธ์์ ์ด๋ฏธ bfs๋ก ํ์ํ๋ ๋ถ๋ถ๋ ๋ ํ์ํ๋ฏ๋ก ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก bfs ํจ์ ์์์ ์ํ์ข์ฐ๋ฅผ ์ดํด๋ด ๊ทธ ๋ฐฐ์ถ๋ก ์ด๋ํ๋ฉด main๋ฌธ์์ ํ์ํ ํ์๊ฐ ์์ผ๋ฏ๋ก list์์ ์ ๊ฑฐํด์ฃผ์ด์ผ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
๋ด๊ฐ ์๊ฐํ ์๊ฐ ์ด๊ณผ ์ด์ ๋ ์์ ๊ฐ๋ค. ์ฝ๋ ํ ์ค์ ์ถ๊ฐํ๋ ๋ฐ๋ก ํต๊ณผํ ์ ์์๋ค.
์๊ฐ๐ค
๋ฌธ์ ๊ฐ ํ๋ฆฌ์ง ์์ ๋๋ ์ ์ ์ ์๋ค๊ฐ ๋ค์ ๋ณด๋ ๊ฒ์ด ๋ ์ข์์ง๋ ใ ใ
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 11724_์ฐ๊ฒฐ ์์์ ๊ฐ์ (0) | 2022.01.26 |
---|---|
[Baekjoon] 5567_๊ฒฐํผ์ (0) | 2022.01.25 |
[Baekjoon] 2667_๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ (0) | 2022.01.07 |
[Baekjoon] 2606_๋ฐ์ด๋ฌ์ค (0) | 2022.01.07 |
[Baekjoon] 1260_DFS์ BFS (0) | 2022.01.06 |