백준

백준 12852

gilola 2024. 12. 28. 23:38

 

li[n] 에는 li[n - 1], li[n / 3], li[n /2]의 최솟값 + 1의 값을 넣어줬다.

다 채워진 li 에서 입력된  li[n - 1], li[n / 3], li[n /2] 중에서 최솟값을 갖는 index를 다시 n으로 설정하였음

 

근데 계속 메모리 초과가 나길래

int(input()) => int(sys.stdin.readline())

list => array 로 바꿔주었더니 해결되었다....!

 

import sys
from array import array

n = int(sys.stdin.readline())

li = array('i', [0] * (n + 3))

li[1] = 0
li[2] = 1
li[3] = 1

result = []

for i in range(4, n + 1):
    if i % 6 == 0:
        li[i] = min(li[i - 1], li[i // 3], li[i // 2]) + 1
    elif i % 3 == 0:
        li[i] = min(li[i - 1], li[i // 3]) + 1
    elif i % 2 == 0:
        li[i] = min(li[i - 1], li[i // 2]) + 1
    else:
        li[i] = li[i - 1] + 1

print(li[n])

while n > 1:
    if n % 6 == 0:
        if li[n - 1] <= li[n // 3] and li[n - 1] <= li[n // 2]:
            result.append(n)
            n -= 1
        elif li[n // 3] <= li[n - 1] and li[n // 3] <= li[n // 2]:
            result.append(n)
            n //= 3
        elif li[n // 2] <= li[n - 1] and li[n // 2] <= li[n // 3]:
            result.append(n)
            n //= 2
    elif n % 3 == 0:
        if li[n - 1] <= li[n // 3]:
            result.append(n)
            n -= 1
        else:
            result.append(n)
            n //= 3
    elif n % 2 == 0:
        if li[n - 1] <= li[n // 2]:
            result.append(n)
            n -= 1
        else:
            result.append(n)
            n //= 2
    else:
        result.append(n)
        n -= 1

result.append(1)

print(*result)

'백준' 카테고리의 다른 글

백준 15989  (2) 2025.01.08
백준 25757  (0) 2025.01.08
백준 2579  (0) 2024.12.28
백준 1541  (0) 2024.12.27
백준 11758  (0) 2024.12.26