๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 1012_์œ ๊ธฐ๋† ๋ฐฐ์ถ”

๋ฟŒ์•ผ._. 2022. 1. 11. 22:48

Silver II

๋ฌธ์ œ(์ถœ์ฒ˜: 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์—์„œ ์ œ๊ฑฐํ•ด์ฃผ์–ด์•ผ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ์‹œ๊ฐ„ ์ดˆ๊ณผ ์ด์œ ๋Š” ์œ„์™€ ๊ฐ™๋‹ค. ์ฝ”๋“œ ํ•œ ์ค„์„ ์ถ”๊ฐ€ํ•˜๋‹ˆ ๋ฐ”๋กœ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. 

 


์ƒ๊ฐ๐Ÿค”

 

๋ฌธ์ œ๊ฐ€ ํ’€๋ฆฌ์ง€ ์•Š์„ ๋•Œ๋Š” ์ž ์‹œ ์ ‘์—ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ๋ณด๋Š” ๊ฒƒ์ด ๋” ์ข‹์„์ง€๋„ ใ…Žใ…Ž