๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 2644_์ดŒ์ˆ˜๊ณ„์‚ฐ

๋ฟŒ์•ผ._. 2022. 3. 14. 21:24

Silver II

๋ฌธ์ œ(์ถœ์ฒ˜: https://www.acmicpc.net/problem/2644)

<์ดŒ์ˆ˜ ๊ณ„์‚ฐ>

๋ฌธ์ œ 

 

์šฐ๋ฆฌ๋‚˜๋ผ๋Š” ๊ฐ€์กฑ ํ˜น์€ ์นœ์ฒ™๋“ค ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ์ดŒ์ˆ˜๋ผ๋Š” ๋‹จ์œ„๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋…ํŠนํ•œ ๋ฌธํ™”๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ดŒ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ณ„์‚ฐ๋œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถ€๋ชจ์™€ ์ž์‹ ์‚ฌ์ด๋ฅผ 1์ดŒ์œผ๋กœ ์ •์˜ํ•˜๊ณ  ์ด๋กœ๋ถ€ํ„ฐ ์‚ฌ๋žŒ๋“ค ๊ฐ„์˜ ์ดŒ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‚˜์™€ ์•„๋ฒ„์ง€, ์•„๋ฒ„์ง€์™€ ํ• ์•„๋ฒ„์ง€๋Š” ๊ฐ๊ฐ 1์ดŒ์œผ๋กœ ๋‚˜์™€ ํ• ์•„๋ฒ„์ง€๋Š” 2์ดŒ์ด ๋˜๊ณ , ์•„๋ฒ„์ง€ ํ˜•์ œ๋“ค๊ณผ ํ• ์•„๋ฒ„์ง€๋Š” 1์ดŒ, ๋‚˜์™€ ์•„๋ฒ„์ง€ ํ˜•์ œ๋“ค๊ณผ๋Š” 3์ดŒ์ด ๋œ๋‹ค.
์—ฌ๋Ÿฌ ์‚ฌ๋žŒ๋“ค์— ๋Œ€ํ•œ ๋ถ€๋ชจ ์ž์‹๋“ค ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ฃผ์–ด์ง„ ๋‘ ์‚ฌ๋žŒ์˜ ์ดŒ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

 

์ž…๋ ฅ

 

์‚ฌ๋žŒ๋“ค์€ 1, 2, 3, …, n (1 ≤ n ≤ 100)์˜ ์—ฐ์†๋œ ๋ฒˆํ˜ธ๋กœ ๊ฐ๊ฐ ํ‘œ์‹œ๋œ๋‹ค. ์ž…๋ ฅ ํŒŒ์ผ์˜ ์ฒซ์งธ ์ค„์—๋Š” ์ „์ฒด ์‚ฌ๋žŒ์˜ ์ˆ˜ n์ด ์ฃผ์–ด์ง€๊ณ , ๋‘˜์งธ ์ค„์—๋Š” ์ดŒ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด์•ผ ํ•˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ์‚ฌ๋žŒ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์…‹์งธ ์ค„์—๋Š” ๋ถ€๋ชจ ์ž์‹๋“ค ๊ฐ„์˜ ๊ด€๊ณ„์˜ ๊ฐœ์ˆ˜ m์ด ์ฃผ์–ด์ง„๋‹ค. ๋„ท์งธ ์ค„๋ถ€ํ„ฐ๋Š” ๋ถ€๋ชจ ์ž์‹ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ๋ฒˆํ˜ธ x, y๊ฐ€ ๊ฐ ์ค„์— ๋‚˜์˜จ๋‹ค. ์ด๋•Œ ์•ž์— ๋‚˜์˜ค๋Š” ๋ฒˆํ˜ธ x๋Š” ๋’ค์— ๋‚˜์˜ค๋Š” ์ •์ˆ˜ y์˜ ๋ถ€๋ชจ ๋ฒˆํ˜ธ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
๊ฐ ์‚ฌ๋žŒ์˜ ๋ถ€๋ชจ๋Š” ์ตœ๋Œ€ ํ•œ ๋ช…๋งŒ ์ฃผ์–ด์ง„๋‹ค.

 

์ถœ๋ ฅ 

 

์ž…๋ ฅ์—์„œ ์š”๊ตฌํ•œ ๋‘ ์‚ฌ๋žŒ์˜ ์ดŒ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๋‘ ์‚ฌ๋žŒ์˜ ์นœ์ฒ™ ๊ด€๊ณ„๊ฐ€ ์ „ํ˜€ ์—†์–ด ์ดŒ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์—†์„ ๋•Œ๊ฐ€ ์žˆ๋‹ค. ์ด๋•Œ์—๋Š” -1์„ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค.

 

 

๋ฌธ์ œ ํ’€์ด

- my solution

import sys

def bfs(graph, start, depth):
    visited=[False]*n # ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
    visited[start-1]=True
    queue=[start]
    while queue:
        temp=queue.pop(0)
        for i in graph[temp]:
            if visited[i-1]==False: # ๋ฐฉ๋ฌธ ์•„์ง ์•ˆํ–ˆ์œผ๋ฉด
                visited[i-1]=True
                depth[i-1]=depth[temp-1]+1
                queue.append(i)

if __name__=='__main__':
    n=int(input()) # ์ „์ฒด ์‚ฌ๋žŒ์˜ ์ˆ˜
    a,b=map(int, sys.stdin.readline().split()) # ๊ณ„์‚ฐํ•ด์•ผํ•˜๋Š” ๋ฒˆํ˜ธ
    m=int(input()) # ๋ถ€๋ชจ ์ž์‹ ์ˆ˜

    graph={}
    depth=[0]*n
    for i in range(n):
        graph[i+1]=[]

    for i in range(m):
       x,y=map(int, sys.stdin.readline().split())
       graph[x].append(y)
       graph[y].append(x)

    bfs(graph, a, depth)

    if depth[b-1]==0: # ์ดŒ์ˆ˜ ๊ณ„์‚ฐ ๋ถˆ๊ฐ€
        print(-1)
    else:
        print(depth[b-1])

 

bfs๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€๋‹ค.

 

  • bfs
    : visited = ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ํ™•์ธํ•˜๋Š” list
    : queue๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต = ์ œ์ผ ์ฒ˜์Œ ๊ฐ’์„ pop ํ•ด์„œ ๊ทธ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ฐฉ๋ฌธ ํ›„  depth ์ €์žฅ ๋ฐ queue์— ์ €์žฅ
  • main
    : ์ „์ฒด ์‚ฌ๋žŒ์˜ ์ˆ˜ ์ž…๋ ฅ
    : ๊ณ„์‚ฐํ•ด์•ผ ํ•˜๋Š” ๋ฒˆํ˜ธ ์ž…๋ ฅ
    : ๋ถ€๋ชจ ์ž์‹ ์ˆ˜ ์ž…๋ ฅ ๋ฐ graph ์ €์žฅ 
    : bfs ํ˜ธ์ถœ
    : ์ดŒ์ˆ˜ ๊ณ„์‚ฐ ๋ถˆ๊ฐ€ํ•  ๊ฒฝ์šฐ -1 ์ถœ๋ ฅ or ์ดŒ์ˆ˜ ์ถœ๋ ฅ

โ“ ์™œ graph๋ฅผ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ๋งŒ๋“ค์—ˆ๋Š”๊ฐ€?

์ฒ˜์Œ์—๋Š” ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ graph๋ฅผ ๋งŒ๋“œ๋ ค๊ณ  ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ํ•  ๊ฒฝ์šฐ root๋ฅผ ๊ตฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ธˆ ๋ณต์žกํ•ด์งˆ ๊ฒƒ ๊ฐ™์•˜๋‹ค.

๊ทธ๋ž˜์„œ ๊ณ„์‚ฐํ•ด์•ผ ํ•˜๋Š” ๋ฒˆํ˜ธ๋ฅผ ์‹œ์ž‘ ๋…ธ๋“œ๋กœ ํ•˜์—ฌ bfs๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ์–‘๋ฐฉํ–ฅ์œผ๋กœ graph๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๊ณ„์‚ฐํ•ด์•ผ ํ•˜๋Š” ๋ฒˆํ˜ธ๋ฅผ ์‹œ์ž‘์œผ๋กœ ์ดŒ์ˆ˜(depth)๋ฅผ ๋ฐ”๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 


์ƒ๊ฐ๐Ÿค”

 

์ด์ œ bfs, dfs ๋ง๊ณ  ๋‹ค๋ฅธ ๋ฌธ์ œ๋กœ ๋„˜์–ด๊ฐ€๋ณผ๊นŒ?๋ผ๊ณ  ์ƒ๊ฐ ์ค‘