๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“Š Algorithm/BOJ

โœ… BOJ 12851 - BFS ๊ฐ€์ง“ ์ˆ˜ ๋ˆ„์ 

by huis_log 2025. 7. 11.

๋ฌธ์ œ - ์ˆจ๋ฐ”๊ผญ์งˆ 2

์ˆ˜๋นˆ์ด๊ฐ€ ๊ฑท๊ฑฐ๋‚˜ ์ˆœ๊ฐ„์ด๋™ํ•ด์„œ ๋™์ƒํ•œํ…Œ ๊ฐ€์•ผ ํ•จ. ์ตœ์†Œ ์‹œ๊ฐ„์œผ๋กœ ๋„์ฐฉํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๊นŒ์ง€ ๊ตฌํ•ด์•ผ ํ•จ.

  • ๊ฑท๊ธฐ: -1, +1
  • ์ˆœ๊ฐ„์ด๋™: *2

์ˆœ๊ฐ„์ด๋™๋งŒ ๋ฌด์กฐ๊ฑด ๋น ๋ฅด๋‹ค๋Š” ๋ณด์žฅ ์—†์Œ. ๋’ค๋กœ ๊ฐ”๋‹ค๊ฐ€ ์ˆœ๊ฐ„์ด๋™์ด ๋” ๋น ๋ฅผ ์ˆ˜๋„ ์žˆ์Œ. ๊ทธ๋ž˜์„œ ์ „๋ถ€ ๋™์‹œ์— ๋ด์•ผ ํ•จ.

 

์ „๋žต

์ตœ๋‹จ ์‹œ๊ฐ„์— ๋™์ƒ ์ฐพ๋Š” ๊ฑด ์‰ฌ์›€. ๋ฌธ์ œ๋Š” ๊ฒฝ๋กœ ๊ฐ€์ง“์ˆ˜๊นŒ์ง€ ์„ธ์•ผ ํ•œ๋‹ค๋Š” ๊ฑฐ.

์ˆœ๊ฐ„์ด๋™๋งŒ ํ•˜๋ฉด ๋น ๋ฅด๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฐ”๋กœ ํ‹€๋ฆฐ๋‹ค. ๋’ค๋กœ ๊ฐ”๋‹ค๊ฐ€ ์ˆœ๊ฐ„์ด๋™ํ•ด์„œ ๋” ๋นจ๋ผ์งˆ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ.

 

์ด๋Ÿฐ ๋ฌธ์ œ๋Š” ๋ฌด์กฐ๊ฑด BFS๋‹ค. ํ•œ ์นธ ์•ž์œผ๋กœ, ๋’ค๋กœ, 2๋ฐฐ ์ด๋™ ์ „๋ถ€ ๊ฐ™์€ ๋น„์šฉ์ด๋ผ ๋ ˆ๋ฒจ ํƒ์ƒ‰์œผ๋กœ ๋‹ค ๊ฐ™์ด ๋ด์•ผ ํ•œ๋‹ค.

ํ•œ ๋ฒˆ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ๋๋‚˜๋Š” ๊ฒŒ ์•„๋‹˜. ๊ฐ™์€ ์œ„์น˜์— ๊ฐ™์€ ์‹œ๊ฐ„์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฉด ๊ทธ๊ฒŒ ์ „๋ถ€ ์ตœ๋‹จ ๊ฒฝ๋กœ์ž„.

๊ทธ๋ž˜์„œ visited๋Š” ์‹œ๊ฐ„ ๊ธฐ๋ก์šฉ, cnt๋Š” ๊ทธ ์‹œ๊ฐ„์— ๋„์ฐฉํ•˜๋Š” ๊ฒฝ๋กœ ์ˆ˜ ๋ˆ„์ ์šฉ์œผ๋กœ ์‚ฌ์šฉํ•จ.

 

์ฒ˜์Œ ๋ฐฉ๋ฌธํ•˜๋ฉด cnt[next] = cnt[current]๋กœ ์ด์ „๊นŒ์ง€ ๊ฒฝ๋กœ ์ˆ˜ ๊ทธ๋Œ€๋กœ ๋„˜๊ธด๋‹ค.

์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์ž๋ฆฌ๋ผ๋„ ๊ฐ™์€ ์‹œ๊ฐ„์œผ๋กœ ๋˜ ๊ฐ€๋ฉด cnt[next] += cnt[current]๋กœ ๋”ํ•œ๋‹ค.

DFS ์“ฐ๋ฉด ๋ชจ๋“  ๊ฒฝ๋กœ ๋๊นŒ์ง€ ๋ด์•ผ ํ•ด์„œ ์‹œ๊ฐ„ ํ„ฐ์ง.

 

ํ•ต์‹ฌ์€ visited๋ž‘ cnt ๋‘˜ ๋‹ค ์ œ๋Œ€๋กœ ์“ฐ๋Š” ๊ฑฐ. ์•ˆ ๊ทธ๋Ÿฌ๋ฉด ์‹œ๊ฐ„์€ ๋งž๊ณ  ๊ฐ€์ง“์ˆ˜๋Š” ํ‹€๋ฆผ.


#bfs
#์ตœ๋‹จ ์‹œ๊ฐ„, ๊ฒฝ๋กœ ์ˆ˜
from collections import deque
import sys
input=sys.stdin.readline

def bfs(start,end):
    limit=10**5+1
    #์ตœ๋‹จ๊ฒฝ๋กœ ์‹œ๊ฐ„
    visited=[-1]*limit
    visited[start]=0
    #์ตœ๋‹จ๊ฒฝ๋กœ ๊ฐ€์ง“์ˆ˜
    cnt=[0]*limit
    cnt[start]=1
    q=deque([start])
    
    while q:
        current=q.popleft()
        
        for next in [current-1,current+1,current*2]:
            if 0<=next<limit:
                if visited[next]==-1:
                    visited[next]=visited[current]+1
                    cnt[next]=cnt[current]
                    q.append(next)
                #์ด๋ฏธ ๋ฐฉ๋ฌธํ–ˆ๋Š”๋ฐ, ๊ฐ™์€ ์‹œ๊ฐ„์œผ๋กœ ๋˜ ๋„์ฐฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์ตœ๋‹จ๊ฒฝ๋กœ ์ถ”๊ฐ€
                elif visited[next]==visited[current]+1:
                    cnt[next]+=cnt[current]
    
    return visited[end],cnt[end]

def main():
    n,k=map(int,input().split())
    t,c=bfs(n,k)
    print(t)
    print(c)
  
if __name__=="__main__":
    main()
๋ฐ˜์‘ํ˜•