[Baekjoon/๐Ÿฅ‡โ…ค] 9251: ์ˆจ๋ฐ”๊ผญ์งˆ3

2 ๋ถ„ ์†Œ์š”

๐Ÿ™‹โ€โ™€๏ธ ์ˆจ๋ฐ”๊ผญ์งˆ3

์ˆ˜๋นˆ์ด๋Š” ๋™์ƒ๊ณผ ์ˆจ๋ฐ”๊ผญ์งˆ์„ ํ•˜๊ณ  ์žˆ๋‹ค. ์ˆ˜๋นˆ์ด๋Š” ํ˜„์žฌ ์  N(0 โ‰ค N โ‰ค 100,000)์— ์žˆ๊ณ , ๋™์ƒ์€ ์  K(0 โ‰ค K โ‰ค 100,000)์— ์žˆ๋‹ค. ์ˆ˜๋นˆ์ด๋Š” ๊ฑท๊ฑฐ๋‚˜ ์ˆœ๊ฐ„์ด๋™์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ, ์ˆ˜๋นˆ์ด์˜ ์œ„์น˜๊ฐ€ X์ผ ๋•Œ ๊ฑท๋Š”๋‹ค๋ฉด 1์ดˆ ํ›„์— X-1 ๋˜๋Š” X+1๋กœ ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ค. ์ˆœ๊ฐ„์ด๋™์„ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” 0์ดˆ ํ›„์— 2*X์˜ ์œ„์น˜๋กœ ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ค.

์ˆ˜๋นˆ์ด์™€ ๋™์ƒ์˜ ์œ„์น˜๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ˆ˜๋นˆ์ด๊ฐ€ ๋™์ƒ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ์‹œ๊ฐ„์ด ๋ช‡ ์ดˆ ํ›„์ธ์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

๐Ÿ™‹โ€โ™€๏ธ ์ž…๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์— ์ˆ˜๋นˆ์ด๊ฐ€ ์žˆ๋Š” ์œ„์น˜ N๊ณผ ๋™์ƒ์ด ์žˆ๋Š” ์œ„์น˜ K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. N๊ณผ K๋Š” ์ •์ˆ˜์ด๋‹ค.

๐Ÿ™‹โ€โ™€๏ธ ์ถœ๋ ฅ

์ˆ˜๋นˆ์ด๊ฐ€ ๋™์ƒ์„ ์ฐพ๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค.


๐Ÿ‘ฉโ€๐Ÿ’ป Algoritm: bfs ์ ์šฉ

์ˆ˜๋นˆ์ด๊ฐ€ ๋™์ƒ์„ ์ฐพ๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ์‹œ๊ฐ„์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด bfs๋ฅผ ์ ์šฉํ•˜์˜€๋‹ค.

โŒจ๏ธ bfs

from collections import deque
import sys

def bfs():
  dq = deque([[s, 0]])
  visited = set([s])

  while dq:
    cur, time = dq.popleft()

    if cur == b:
      print(time)
      return
    else:
      if cur < b:
        if cur*2 not in visited:
          dq.append([cur*2, time])
          visited.add(cur*2)
        if cur+1 not in visited:
          dq.append([cur+1, time+1])
          visited.add(cur+1)
      if cur > 0 and cur-1 not in visited:
        dq.append([cur-1, time+1])
        visited.add(cur-1)

s, b = map(int, sys.stdin.readline().split())
if b < s:
  print(s-b)
else:
  bfs()

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์งœ๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ ์˜ค๋‹ต์ด์—ˆ๋‹ค. ์ด์œ ๊ฐ€ ๋ฌด์—‡์ผ๊นŒ ๊ณ ๋ฏผ์„ ํ•˜๋˜ ์ค‘ ํ•œ ๊ฒŒ์‹œ๊ธ€์„ ํ†ตํ•ด์„œ ๊ทธ ์›์ธ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์šฐ์„  ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๋ฌธ์ œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ •๋ฆฌํ•ด๋ณด์ž!

โญ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰

  • ๋ชจ๋“  ๊ฐ€์ค‘์น˜ ๋™์ผ
    • dfs/bfs
  • ํ•œ ๋…ธ๋“œ์—์„œ ๋‹ค๋ฅธ ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ
    • ์Œ์˜ ๊ฐ€์ค‘์น˜ ์กด์žฌ
      • ๋ฒค๋งŒ-ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ์–‘์˜ ๊ฐ€์ค‘์น˜๋งŒ ์กด์žฌ
      • ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ๋ชจ๋“  ๋…ธ๋“œ ์‚ฌ์ด์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ
    • ํ”Œ๋กœ์ด๋“œ ์›Œ์ƒฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ทธ๋ ‡๋‹ค! ์›๋ž˜ bfs/dfs๋Š” ๋ชจ๋“  ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ๋™์ผํ•˜๋‹ค๋Š” ์ „์ œ์กฐ๊ฑด์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ€์ค‘์น˜๊ฐ€ 0/1์ธ ์ด ๋ฌธ์ œ๋Š” ๋‹จ์ˆœ bfs๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ โญ๊ฐ€์ค‘์น˜๊ฐ€ 0์ธ ๊ฒฝ์šฐ๋ฅผ ํ์˜ ๋งจ ์•ž์— ๋„ฃ์–ด์คŒ์œผ๋กœ์จโญ ์šฐ์„ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ž!!

โŒจ๏ธ 0-1 bfsโญ

from collections import deque
import sys

def bfs():
  dq = deque([[s, 0]])
  visited = set([s])

  while dq:
    cur, time = dq.popleft()

    if cur == b:
      print(time)
      return
    else:
      if cur < b:
        if cur*2 not in visited:
          dq.appendleft([cur*2, time]) # โญโญโญ
          visited.add(cur*2)
        if cur+1 not in visited:
          dq.append([cur+1, time+1])
          visited.add(cur+1)
      if cur > 0 and cur-1 not in visited:
        dq.append([cur-1, time+1])
        visited.add(cur-1)

s, b = map(int, sys.stdin.readline().split())
if b < s:
  print(s-b)
else:
  bfs()


๐Ÿ‘ฉโ€๐Ÿ’ป Algoritm: ๋‹ค์ต์ŠคํŠธ๋ผ

ํ•ด๋‹น ๋ฌธ์ œ๋Š” ๋ชจ๋“  ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ๋™์ผํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ํ™œ์šฉํ•ด ๋ฌธ์ œ๋ฅผ ํ’€์ดํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค!

๋‹ค์ต์ŠคํŠธ๋ผ๋Š” ์œ„์—์„œ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ–ˆ๋“ฏ์ด ํ•˜๋‚˜์˜ ์ •์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋ฅผ ํ™œ์šฉํ•œ ํ’€์ด๋ฅผ ํ™•์ธํ•ด๋ณด์ž!!

import sys
from heapq import heappop, heappush

inf = sys.maxsize # ์ •์ˆ˜ ์ตœ๋Œ“๊ฐ’

s, b = map(int, sys.stdin.readline().split())
dp = [inf]*100001
heap = []

def dijkstra(s, b):
  if b <= s:
    print(s-b)
    return

  heappush(heap, [0, s])
  while heap:
    t, c = heappop(heap)
    if c == b:
      print(t)
      return
    else:
      for nx in [c*2, c+1, c-1]:
        if 0<= nx <= 100000:
          if nx == c*2 and dp[nx] == inf:
            dp[nx] = t
            heappush(heap, [t, nx])
          elif dp[nx] == inf:
            dp[nx] = t+1
            heappush(heap, [t+1, nx])

dijkstra(s, b)


๐Ÿ“ ์ฐธ๊ณ  ์ž๋ฃŒ

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ