๋ฐฑ์ค€ 12852 ํŒŒ์ด์ฌ

2022. 1. 12. 21:03ใ†๐Ÿ”ฑ Algorithm/DP

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

 

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

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

www.acmicpc.net

 

 

์ •๋‹ต ์ฝ”๋“œ (์†๋„ ๋น ๋ฆ„)

def solution():
    visited = []
    queue = [[N, [N]]]

    while queue:
        number, path = queue.pop(0)
        if number == 1:
            print(queue)
            print(len(path) - 1)
            print(" ".join(map(str, path)))
            break

        if number not in visited:
            visited.append(number)
            if number % 3 == 0:
                queue.append([number // 3, path + [number // 3]])
            if number % 2 == 0:
                queue.append([number // 2, path + [number // 2]])
            queue.append([number - 1, path + [number - 1]])


N = int(input())
solution()

 

์•„๋ž˜์— ์†๋„๊ฐ€ ๋น„๊ต์  ๋Š๋ฆฐ ์ •๋‹ต ์ฝ”๋“œ์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ, ์œ„ ์ฝ”๋“œ๋Š” visited ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ํ•œ๋ฒˆ ์—ฐ์‚ฐํ•œ ๊ฐ’์„ ์ฒดํฌํ•œ๋‹ค. ๊ทธ๋ฆฌํ•˜์—ฌ ๋ฐ˜๋ณต์ ์ธ ์—ฐ์‚ฐ์„ ๋ง‰๋Š”๋ฐ, ์•„๋ž˜ ์ฝ”๋“œ๋Š” visited ๋กœ ํ™•์ธํ•˜๋Š” ๋Œ€์‹ , ๊ธฐ์กด์˜ ์—ฐ์‚ฐ ๊ฐ’( ์•„๋ž˜ ์ฝ”๋“œ ๊ธฐ์ค€ dp[i][0])์ด  ์ƒˆ๋กœ ๊ณ„์‚ฐ ํ•œ ๊ฐ’๋ณด๋‹ค ์ž‘์œผ๋ฉด ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํƒํ–ˆ๋‹ค. ์ฆ‰ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์ˆซ์ž์— ๋Œ€ํ•ด์„œ๋„ ๋งค๋ฒˆ ๋น„๊ต ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„์˜ ์ฝ”๋“œ๋ณด๋‹ค ์†๋„๊ฐ€ ๋–จ์–ด์ง€๋Š” ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค.

 

 

์ •๋‹ต ์ฝ”๋“œ (์†๋„ ๋Š๋ฆผ)

N = int(input())
dp = [[0, []] for _ in range(N + 1)]
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(*dp[N][1][::-1])

 

 

ํ‹€๋ฆฐ ํ’€์ด (๋‚ด ์ฝ”๋“œ ใ… )

์ž˜๋ชป ์ƒ๊ฐํ•œ ์ ์ด ์žฌ๊ท€ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ queue ๋ฅผ  n ๊ณผ ๋ถ„๋ฆฌํ•˜์—ฌ ๋„ฃ์€ ๊ฒƒ์ด๋‹ค.

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

๋งค๋ฒˆ ์žฌ๊ท€๋งˆ๋‹ค queue ์— ๊ฐ’์ด append ๋˜๊ธฐ ๋•Œ๋ฌธ์— , ๊ฐ ์ˆซ์ž n ์— ๋Œ€ํ•œ history ๊ฐ€ ๋‚จ์ง€ ์•Š๊ณ , ๋ชจ๋‘ ํ•ฉ์ณ์ง„ history ๊ฐ€ ๋‚จ๊ฒŒ ๋˜์–ด ์˜ค๋‹ต์— ์ด๋ฅด๊ฒŒ ๋๋‹ค. ์ฆ‰ ์ด๋Ÿฐ์‹์œผ๋กœ ํ’€๊ณ  ์‹ถ์—ˆ๋‹ค๋ฉด ์žฌ๊ท€ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ n ๊ณผ queue ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด์„œ ๋˜์ ธ์•ผํ•œ๋‹ค. 

from sys import stdin

read = stdin.readline
n = int(read())
dp = [0] * (n + 1)
queue = [n]
def recursive(n, queue):
    if n < 1:
        return False
    if n == 1:
        return [n, queue]
    if n % 3 == 0:
        a = n // 3
        dp[a] = dp[n] + 1
        queue.append(a)
        recursive(a, queue)
    if n % 2 == 0:
        a = n // 2
        dp[a] = dp[n] + 1
        queue.append(a)
        recursive(a, queue)
    a = n - 1
    queue.append(a)
    return recursive(a, queue)
answer = recursive(n, queue)

 

'๐Ÿ”ฑ Algorithm > DP' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋ฐฑ์ค€ 11055 ํŒŒ์ด์ฌ  (0) 2022.01.23
๋ฐฑ์ค€ 1912 ํŒŒ์ด์ฌ  (0) 2022.01.20
๋ฐฑ์ค€ 11053 ํŒŒ์ด์ฌ  (0) 2022.01.18
๋ฐฑ์ค€ 2293 ํŒŒ์ด์ฌ  (0) 2022.01.09
๋ฐฑ์ค€ 1699 ํŒŒ์ด์ฌ  (0) 2022.01.07