๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/๋ฐฑ์ค€

[๋ฐฑ์ค€] 1463 1๋กœ ๋งŒ๋“ค๊ธฐ (ํŒŒ์ด์ฌ/python) dp, bfs

by chjcoder 2023. 8. 3.

๐ŸŽˆ๋ฌธ์ œ

https://www.acmicpc.net/problem/1463

 

๐ŸŽ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜?

1. bfs, dp

2. ์‚ฌ์‹ค ๊ฐ€์žฅ ๋จผ์ € ์ƒ๊ฐ๋‚œ ๊ฒƒ์€ bfs์ด๋‹ค. 1์ฐจ์› ๋ฆฌ์ŠคํŠธ์—์„œ “์ตœ์†Œ ๋ช‡๋ฒˆ ~๋ฅผ ํ•ด์•ผํ•˜๋Š”์ง€ ๊ตฌํ•˜์‹œ์˜ค”์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋‚˜์™”์„ ๊ฒฝ์šฐ bfs๋ฅผ ๋– ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋„๋ก ๊ณต๋ถ€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

3. ํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ dp๋ฅผ ์ด์šฉํ•˜๋ฉด ๋” ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.

bfs : 852ms

dp : 644ms

 

4. ๋ฐ‘์— dp์™€ bfs๋กœ ๋ชจ๋‘ ํ’€์–ด๋ณด๊ณ  ์ž์„ธํ•œ ์„ค๋ช…์„ ์ฒจ๋ถ€ํ–ˆ๋‹ค.

 

๐Ÿ’ป dp ์ฝ”๋“œ

# 1463 1๋กœ ๋งŒ๋“ค๊ธฐ (dp ์‚ฌ์šฉ)

# 1. ์ž…๋ ฅ ๋ฐ›๊ธฐ
n = int(input())
dp = [0 for _ in range(n+1)]

for i in range(2,n+1):
    dp[i] = dp[i-1] + 1
    '''
    ์šฐ๋ฆฌ๋Š” 1๋ถ€ํ„ฐ n์„ ์ฐพ์•„๊ฐ€๋Š” ๋ฐฉ์‹์„ ์ด์šฉํ•  ๊ฑด๋ฐ,
    4๋ฅผ ์˜ˆ๋กœ ๋“ค๋ฉด, 4๊ฐ€ ๋˜๋ ค๋ฉด 1์”ฉ ๋”ํ•ด์„œ  
    1->2->3->4์˜ ๊ณผ์ •์„ ํ†ตํ•ด์„œ ๊ฐ๊ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฐ์‚ฐ ํšŸ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
    0  1  2  3
    ๊ทธ๋Ÿฐ๋ฐ 4๋Š” 2๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฏ€๋กœ 2์—์„œ 4๋กœ ๋ฐ”๋กœ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. -> min(3,2)๋ฅผ ํ†ตํ•ด 2๊ฐ€ ๋จ
    ๋˜ํ•œ 4๋Š” 3์—์„œ 1์„ ๋”ํ•จ์œผ๋กœ์จ 2๋ฒˆ๋งŒ์— ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. -> min(2,2)๋ฅผ ํ†ตํ•ด 2๋กœ ์ตœ์ข… ๊ฒฐ์ • ๋จ
    1->2->3->4
    0  1  1  2
    ์ด๋ ‡๊ฒŒ ์ตœ์•…์˜ ์—ฐ์‚ฐ ํšŸ์ˆ˜(3)๊ณผ ๋” ์ ์€ ์—ฐ์‚ฐํšŸ์ˆ˜(2)๋ฅผ min()ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด
    ๋น„๊ตํ•œ ํ›„, ๋” ์ ์€ ์—ฐ์‚ฐํšŸ์ˆ˜๋ฅผ ์ฑ„ํƒํ•ด ์คŒ์œผ๋กœ์จ ์ตœ์†Ÿ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
    '''
    if i%2 == 0:  # 2๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฉด
        dp[i] = min(dp[i],dp[i//2]+1)
    if i%3 == 0:    # 3์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฉด
        dp[i] = min(dp[i],dp[i//3]+1)

print(dp)
print(dp[n])

๐ŸŽ„์ฝ”๋“œ ์„ค๋ช…

    ์šฐ๋ฆฌ๋Š” 1๋ถ€ํ„ฐ n์„ ์ฐพ์•„๊ฐ€๋Š” ๋ฐฉ์‹์„ ์ด์šฉํ•  ๊ฑด๋ฐ,

    4๋ฅผ ์˜ˆ๋กœ ๋“ค๋ฉด, 4๊ฐ€ ๋˜๋ ค๋ฉด 1์”ฉ ๋”ํ•ด์„œ  

    1->2->3->4์˜ ๊ณผ์ •์„ ํ†ตํ•ด์„œ ๊ฐ๊ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฐ์‚ฐ ํšŸ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

    0  1  2  3

    ๊ทธ๋Ÿฐ๋ฐ 4๋Š” 2๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฏ€๋กœ 2์—์„œ 4๋กœ ๋ฐ”๋กœ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

    1->2->3->4

    0  1  2  2 ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

    ์ด๋ ‡๊ฒŒ ์ตœ์•…์˜ ์—ฐ์‚ฐ ํšŸ์ˆ˜(3)๊ณผ ๋” ์ ์€ ์—ฐ์‚ฐํšŸ์ˆ˜(2)๋ฅผ min()ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด

    ๋น„๊ตํ•œ ํ›„, ๋” ์ ์€ ์—ฐ์‚ฐํšŸ์ˆ˜๋ฅผ ์ฑ„ํƒํ•ด ์คŒ์œผ๋กœ์จ ์ตœ์†Ÿ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ’ป bfs ์ฝ”๋“œ

from collections import deque

def bfs(x):
    deq = deque()
    deq.append(x)

    while deq:
        x = deq.popleft()

        if x == n:
            print(graph[x])
            return

        for i in [2*x,3*x,x+1]:
            if i > n:
                continue
            if graph[i] == 0:
                graph[i] = graph[x]+1
                deq.append(i)
    return

# 1. ์ž…๋ ฅ ๋ฐ›๊ธฐ
n = int(input())

graph = [0 for _ in range(n+1)]

# 3. ํƒ์ƒ‰
bfs(1)
print(graph)

๐ŸŽ„์ฝ”๋“œ ์„ค๋ช…

1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ [2*x, 3*x, x+1] ์„ธ ๋ฐฉ๋ฒ•์„ ๋Œ์•„๊ฐ€๋ฉด์„œ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ, ๊ฐ ์ž๋ฆฌ์— ์ตœ์†Ÿ๊ฐ’์ด ๋จผ์ € ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋ฏ€๋กœ

ํ•œ๋ฒˆ๋„ ๊ฑฐ์น˜์ง€ ์•Š์€ ๋นˆ ๊ณต๊ฐ„์ธ์ง€๋งŒ์„ ํŒ๋‹จํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.

1->2->3->4->5->6

0    1    1    2     3    2