๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 2667_๋‹จ์ง€๋ฒˆํ˜ธ๋ถ™์ด๊ธฐ

๋ฟŒ์•ผ._. 2022. 1. 7. 15:52

Silver I

๋ฌธ์ œ(์ถœ์ฒ˜: 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