[BOJ] 13913. ์ˆจ๋ฐ”๊ผญ์งˆ 4(๐Ÿฅ‡, BFS)

lemythe423ยท2023๋…„ 6์›” 30์ผ
0

BOJ ๋ฌธ์ œํ’€์ด

๋ชฉ๋ก ๋ณด๊ธฐ
11/133
post-thumbnail

๋ฌธ์ œ

ํ’€์ด

์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ธฐ = bfs ํ’€์ด

ํ’€์ด1(์‹œ๊ฐ„์ดˆ๊ณผ)

๋ฌด์‹ํ•˜๊ฒŒ ๋ชจ๋“  ์ด๋™ ๋ฃจํŠธ๋“ค์„ ํ์— ๊ฐ™์ด ์ €์žฅํ–ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ„ฐ์ง€๋“  ์ €์žฅํ•˜๋‹ค ์‹œ๊ฐ„์ด ํ„ฐ์ง€๋“  ๋‘˜ ์ค‘ ํ•˜๋‚˜์ผ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์‹œ๊ฐ„์ด ํ„ฐ์กŒ๋‹ค

# ์ˆจ๋ฐ”๊ผญ์งˆ 4

def bfs(N, K):
    queue = [(N, [N])]

    visited[N] = 1
    while queue:
        s, route = queue.pop(0)
        
        # print(route, s, K)
        if s == K:
            return route
        
        t = visited[s]
        if -1<s-1 and visited[s-1] == -1:
            queue.append((s-1, route+[s-1]))
            visited[s-1] = t+1
        if s+1<100001 and visited[s+1] == -1:
            queue.append((s+1, route+[s+1]))
            visited[s+1] = t+1
        if s*2<100001 and visited[s*2] == -1:
            queue.append((s*2, route+[2*s]))
            visited[s*2] = t+1


N, K = map(int, input().split())
visited = [-1]*100001

route = bfs(N, K)
print(visited[K]-1)
print(*route)

ํ’€์ด2

๊ทผ๋ฐ ์• ์ดˆ์— ์‹œ๊ฐ„์ด ์•ˆ ํ„ฐ์ ธ๋„ ์œ„์˜ ํ’€์ด๋Š” ํ‹€๋ฆด ์ˆ˜ ๋ฐ–์— ์—†์—ˆ๋‹ค.
์ด ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ์กฐํ•ด์„œ ํ’€์–ด๋„ ๊ณ„์† ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜๊ธธ๋ž˜ ์ด์œ ๋ฅผ ์ฐพ์•„๋ดค๋”๋‹ˆ

์ฒ˜์Œ๋ถ€ํ„ฐ visited๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด ์•ˆ ๋˜๋Š”๊ฑฐ์˜€๋‹ค.

๋ธ”๋กœ๊ทธ์˜ ํ’€์ด๋Š” ์š”์•ฝํ•˜๋ฉด

  1. visited ๋ฐฐ์—ด์—๋Š” ์ง์ „ ์œ„์น˜๋ฅผ ๊ธฐ๋กํ•œ๋‹ค
  2. ํ์—๋Š” ์ด๋™ํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•œ๋‹ค

์ธ๋ฐ, ์œ„์˜ ๋‚ด ํ’€์ด์™€ ์™„์ „ ๋ฐ˜๋Œ€๋‹ค. ๋‚˜๋Š” visited๋ฐฐ์—ด์— ์‹œ๊ฐ„์„, ํ์— ์ด๋™ ์œ„์น˜๋ฅผ ๊ธฐ๋กํ–ˆ๋Š”๋ฐ ํ์— ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•˜๋ฉด ์‹œ๊ฐ„์€ ๊ณ„์† ์ˆซ์žํ•˜๋‚˜๋กœ ๊ธฐ๋ก๋˜์ง€๋งŒ ์ด๋™ ์œ„์น˜๋ฅผ ๊ธฐ๋กํ•˜๋ฉด ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋ฌดํ•œ๋Œ€๋กœ ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํšจ์œจ์ ์ด๋‹ค.

# 168ms

from collections import deque

N, K = map(int, input().split())
path, visited = [], [-1]*100001

def bfs(start, target):
    queue = deque()
    queue.append((start, 0))

    # visited ๋ฐฐ์—ด์— ์ด์ „์˜ ์œ„์น˜๋ฅผ ๊ธฐ๋ก
    # queue์— ์ด๋™ํ•œ ์‹œ๊ฐ„(cur_time) ๊ธฐ๋ก

    # target์„ ๋ฐœ๊ฒฌํ•˜๋ฉด ์ด์ „์œผ๋กœ ํ•œ์นธ์”ฉ ์ด๋™ํ•˜๋‹ค๊ฐ€ 
    # ์ตœ์ดˆ ์ง€์ (visited๊ฐ€ start์ธ ๊ณณ)์„ ๋งŒ๋‚˜๋ฉด ์ข…๋ฃŒ
    visited[start] = start
    while queue:
        now, move_time = queue.popleft()

        if now == target:
            cur = now

            # visited[cur]์—๋Š” cur์— ์˜ค๊ธฐ ์ง์ „์˜ ์œ„์น˜๊ฐ€ ๊ธฐ๋ก๋˜์–ด ์žˆ์Œ
            # ์ถœ๋ฐœ์ ์— ๋„์ฐฉํ•˜๋ฉด ์ถœ๋ฐœ์ ์€ path์— ์ถ”๊ฐ€๋˜์ง€ ์•Š๊ณ  ์ข…๋ฃŒ๋˜๋ฏ€๋กœ ๋”ฐ๋กœ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•จ
            while cur != start:
                path.append(cur)
                cur = visited[cur]
            path.append(start)
            return move_time
        
        if now+1 < 100001 and visited[now+1] == -1:
            visited[now+1] = now
            queue.append((now+1, move_time+1))
        
        if now-1 > -1 and visited[now-1] == -1:
            visited[now-1] = now
            queue.append((now-1, move_time+1))

        if now*2 < 100001 and visited[2*now] == -1:
            visited[2*now] = now
            queue.append((2*now, move_time+1))

print(bfs(N, K))
print(*path[::-1])
profile
์•„๋ฌด๋ง์ด๋‚˜ํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€