๐Ÿ—๏ธ Algorithm/๐ŸŸฉ ๋ฐฑ์ค€

๐ŸŸฉ [๋ฐฑ์ค€] [Python] [Class4] 12852๋ฒˆ_1๋กœ ๋งŒ๋“ค๊ธฐ 2

Dbswnstjd 2022. 11. 19. 05:36

๋ฌธ์ œ

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

 

12852๋ฒˆ: 1๋กœ ๋งŒ๋“ค๊ธฐ 2

์ฒซ์งธ ์ค„์— 1๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 106๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค.

www.acmicpc.net

ํ’€์ด

BFS๋ฅผ ์ด์šฉํ•œ ํ’€์ด

# ๋ฐฑ์ค€ 12852๋ฒˆ ๋ฌธ์ œ - 1๋กœ ๋งŒ๋“ค๊ธฐ 2
from collections import deque

n = int(input())
q = deque()
q.append((n,[n]))
visited = [0]*(n+1)

while q:
    num,ans = q.popleft()
    if num == 1:
        print(len(ans)-1)
        print(*ans)
        break
    if not visited[num]:
        visited[num]=1
        if num%3==0:
            q.append((num//3,ans+[num//3]))
        if num%2==0:
            q.append((num//2,ans+[num//2]))
        q.append((num-1,ans+[num-1]))

 

DP๋ฅผ ์ด์šฉํ•œ ํ’€์ด๋„ ์žˆ๋Š”๋ฐ ์ดํ•ด๊ฐ€ ์ž˜ ๋˜์ง€ ์•Š์•„์„œ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค. 

import sys
input = sys.stdin.readline

n = int(input())
dp = [[0, []] for _ in range(n + 1)]
dp[1][0] = 0
dp[1][1] = [1]

for i in range(2, n + 1):
    dp[i][0] = dp[i-1][0] + 1
    dp[i][1] = dp[i-1][1] + [i]
    if i % 3 == 0 and dp[i // 3][0] + 1 < dp[i][0]:
        dp[i][0] = dp[i // 3][0] + 1
        dp[i][1] = dp[i // 3][1] + [i]
    if i % 2 == 0 and dp[i // 2][0] + 1 < dp[i][0]:
        dp[i][0] = dp[i // 2][0] + 1
        dp[i][1] = dp[i // 2][1] + [i]

print(dp[n][0])
print(*reversed(dp[n][1]))