๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/2667)
<๋จ์ง ๋ฒํธ ๋ถ์ด๊ธฐ>
๋ฌธ์
<๊ทธ๋ฆผ 1>๊ณผ ๊ฐ์ด ์ ์ฌ๊ฐํ ๋ชจ์์ ์ง๋๊ฐ ์๋ค. 1์ ์ง์ด ์๋ ๊ณณ์, 0์ ์ง์ด ์๋ ๊ณณ์ ๋ํ๋ธ๋ค. ์ฒ ์๋ ์ด ์ง๋๋ฅผ ๊ฐ์ง๊ณ ์ฐ๊ฒฐ๋ ์ง์ ๋ชจ์์ธ ๋จ์ง๋ฅผ ์ ์ํ๊ณ , ๋จ์ง์ ๋ฒํธ๋ฅผ ๋ถ์ด๋ ค ํ๋ค. ์ฌ๊ธฐ์ ์ฐ๊ฒฐ๋์๋ค๋ ๊ฒ์ ์ด๋ค ์ง์ด ์ข์ฐ, ํน์ ์๋์๋ก ๋ค๋ฅธ ์ง์ด ์๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค. ๋๊ฐ์ ์์ ์ง์ด ์๋ ๊ฒฝ์ฐ๋ ์ฐ๊ฒฐ๋ ๊ฒ์ด ์๋๋ค. <๊ทธ๋ฆผ 2>๋ <๊ทธ๋ฆผ 1>์ ๋จ์ง๋ณ๋ก ๋ฒํธ๋ฅผ ๋ถ์ธ ๊ฒ์ด๋ค. ์ง๋๋ฅผ ์ ๋ ฅํ์ฌ ๋จ์ง์๋ฅผ ์ถ๋ ฅํ๊ณ , ๊ฐ ๋จ์ง์ ์ํ๋ ์ง์ ์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์๋ ์ง๋์ ํฌ๊ธฐ N(์ ์ฌ๊ฐํ์ด๋ฏ๋ก ๊ฐ๋ก์ ์ธ๋ก์ ํฌ๊ธฐ๋ ๊ฐ์ผ๋ฉฐ 5≤N≤25)์ด ์ ๋ ฅ๋๊ณ , ๊ทธ๋ค์ N ์ค์๋ ๊ฐ๊ฐ N๊ฐ์ ์๋ฃ(0 ํน์ 1)๊ฐ ์ ๋ ฅ๋๋ค.
์ถ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์๋ ์ด ๋จ์ง์๋ฅผ ์ถ๋ ฅํ์์ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ๋จ์ง ๋ด ์ง์ ์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ํ ์ค์ ํ๋์ฉ ์ถ๋ ฅํ์์ค.
๋ฌธ์ ํ์ด
- my solution
import sys
def bfs(graph, x,y, visited): #๋๋น ์ฐ์ ํ์
dx=[-1,0,0,1] #์,์ข,์ฐ,ํ
dy=[0,-1,1,0]
check=0 # ๋จ์ง์ ์ํ๋ ์ง์ ์
temp=[[x,y]] # start
while temp:
x=temp.pop(0)
if visited[x[0]][x[1]]==False: #์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด
visited[x[0]][x[1]] = True # ๋ฐฉ๋ฌธ
check+=1
for i in range(4):
a=x[0]+dx[i]
b=x[1]+dy[i]
if a>=0 and a<len(graph) and b>=0 and b<len(graph): #๋ฒ์์ ์ํ๋ฉด
if graph[a][b]==1 and visited[a][b]==False: # ์ง์ด ์๊ณ , ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด
temp.append([a,b])
return check
if __name__=='__main__':
num=int(input())
arr=[]
for i in range(num):
x=list(map(int, sys.stdin.readline().strip()))
arr.append(x)
visited=[[False]*num for i in range(num)] #๋ฐฉ๋ฌธ ํ์ ๋ฐฐ์ด
result=[]
cnt=0
for i in range(num):
for j in range(num):
if arr[i][j]==1 and visited[i][j]==False: # ์ง์ด ์๊ณ , ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด
temp=bfs(arr, i,j, visited)
result.append(temp)
cnt+=1 # ๋จ์ง ์
result.sort() # ๋จ์ง๋ด ์ง์ ์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ
print(cnt)
for i in result:
print(i)
์ด ๋ฌธ์ ๋ฅผ ์ฒ์ ๋ณด๊ณ ๋ง๋งํ๋ ๋ถ๋ถ์ ์์ ์์น๋ฅผ ์ ํ๋ ๋ถ๋ถ์ด์๋ค. ๊ทธ๋ฌ๋ค๊ฐ ๋จ์ ๋ฐ๋ณต๋ฌธ์ ํตํด ์ง์ด ์๊ณ , ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๊ฒฝ์ฐ bfs๋ฅผ ํธ์ถํ๋ฉด ๋๋ค๋ ๊ฒ์ ์๊ณ ๋ ์ฝ๋๋ฅผ ๊ตฌํํ๊ธฐ ์์ํ๋ค.
- bfs(list, ์์ ์์น x, ์์ ์์น y, ๋ฐฉ๋ฌธ ์ฌ๋ถ list)
- ์ฐ๊ฒฐ๋ ๋ถ๋ถ์ ์ฐพ์์ผ ํ๊ธฐ ๋๋ฌธ์ ์ํ์ข์ฐ๋ฅผ ๋ณด๊ธฐ ์ํด dx, dy ์ ์ธ
- check๋ฅผ ํตํด ๋จ์ง์ ์ํ๋ ์ง์ ์ ์ธ๊ธฐ, temp list์ ์์ ์์น x, y ์ขํ ๋ฃ์ด์ ์ ์ธ
- temp list๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต: temp์์ ๋งจ ์ ๊ฐ์ ๋ฝ์์ ์์ง ๋ฐฉ๋ฌธํ ์ง์ด ์๋๋ผ๋ฉด visited์ ํ์ ํ check+1, ์ํ์ข์ฐ ํ์ธํ์ฌ list ๋ฒ์์ ์ํ๊ณ , ์ง์ด ์์ผ๋ฉฐ, ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด temp list์ x, y ์ขํ ์ถ๊ฐ
- ๋จ์ง์ ์ํ๋ ์ง์ ์ ๋ฐํ - main
- ์ง๋์ ํฌ๊ธฐ ์ ๋ ฅ
- arr, visited, result, cnt ์ ์ธ
- arr์ ์ํํ๋ฉฐ ์ง์ด ์๊ณ ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๊ณณ์ ์ฐพ์ bfs ํธ์ถ -> ๋ฐํ ๊ฐ์ result์ ์ถ๊ฐ ๋ฐ ๋จ์ง ์ cnt +1
- ๋จ์ง ๋ด ์ง์ ์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ ํ ์ถ๋ ฅ
๋ด๊ฐ ์ด ๋ฌธ์ ๋ฅผ ํ๋ฉฐ ๋์ณค๋ ๋ถ๋ถ์ 2๊ฐ์ง์๋ค.
1. ๋จ์ง ๋ด ์ง์ ์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ง ์์ ๊ฒ
2. main๋ฌธ์์ visited ๋ฐฐ์ด์ ์ ์ธ ์ ์์ ๋ณต์ฌ๊ฐ ์ด๋ฃจ์ด์ ธ ๊ฐ์ด ๊ฐ์ด ๋ฐ๋๋ ๊ฒ
1๋ฒ์ ์ฝ๋๋ฅผ ์ ์ถ ํ ํ๋ ธ์ต๋๋ค๋ ๋ณด๊ณ ํด๊ฒฐํ ์ ์์๋ค. ๋ฌธ์ ๋ฅผ ๋ ๊ผผ๊ผผํ ์ฝ์ด์ผ๊ฒ ๋ค...^_^
2๋ฒ์ ๊ฒ์์ ํตํด ํด๊ฒฐํ ์ ์์๋ค. ์ฝ๋๋ฅผ ๊ตฌํ ํ ์ํ๋ ๋ต์ด ๋์ค์ง ์์ ๋๋ฒ๊น ์ ๋๋ ค๋ณธ ๊ฒฐ๊ณผ ๋ฆฌ์คํธ์ ๊ฐ์ด ํ ๋ฒ์ ๊ฐ์ด ์ด๋ฃจ์ด์ง๋ ๊ฒ์ ๋ณผ ์ ์์๋ค. ๊ทธ ์ด์ ๋ ์ฒ์์ ์๋์ ๊ฐ์ด ์ ์ธํ๊ธฐ ๋๋ฌธ์ด๊ณ ์ด๊ฒ์ ๊ฒ์ํด๋ณด๋ ์์ ๋ณต์ฌ๊ฐ ์ด๋ฃจ์ด์ก๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ํ์๋ค.
visited=[[False]*num]*num
์์ ๊ฐ์ ์ฝ๋๋ฅผ
visited=[[False]*num for i in range(num)]
์ด์ ๊ฐ์ด ๋ฐ๊พธ์๋๋ ํด๊ฒฐํ ์ ์์๋ค.
์๊ฐ๐ค
์ด์ dfs, bfs ๊ฐ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ดํ๋ก dfs, bfs ๋ฟ์๊ธฐ๋ฅผ ํ๋ ์ค์ด๋ค. ๋ฟ์ ! ๐
๊ทผ๋ฐ... ๋ง๊ฒ ํ๊ณ ์๋๊ฑด๊ฐ?
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 5567_๊ฒฐํผ์ (0) | 2022.01.25 |
---|---|
[Baekjoon] 1012_์ ๊ธฐ๋ ๋ฐฐ์ถ (0) | 2022.01.11 |
[Baekjoon] 2606_๋ฐ์ด๋ฌ์ค (0) | 2022.01.07 |
[Baekjoon] 1260_DFS์ BFS (0) | 2022.01.06 |
[Baekjoon] 5397_ํค๋ก๊ฑฐ (0) | 2022.01.05 |