일단 코드는 다음과 같습니다.
~~~ python3
import os
import sys
N = []
def classify(beg, end):
global N
M = N[beg:end]
if M.count(M[0]) == len(M):
return 1
progressive = True
for i in range(len(M)-1):
if M[i+1] - M[i] != M[1] - M[0]:
progressive = False
if progressive and abs(M[1] - M[0] == 1):
return 2
alternating = True
for i in range(len(M)):
if M[i] != M[i%2]:
alternating = False
if alternating:
return 4
if progressive:
return 5
return 10
INF = 987654321
cache = [None]
def memorize(beg):
global N, INF, cache
if beg == len(N):
return 0
if cache[beg] != None:
return cache[beg]
cache[beg] = INF
for L in range(3, 5+1):
if beg + L <= len(N):
now = classify(beg, beg + L)
rest = memorize(beg + L)
cache[beg] = min(cache[beg], now + rest)
return cache[beg]
T = int(input().strip())
for _ in range(T):
N = [int(i) for i in input().strip()]
cache = [None] * (len(N) + 2)
answer = memorize(0)
print(answer)
</spoiler>
기본적인 알고리즘은 jm북이고, 같은 알고리즘을 c++로 작성시에는 통과했습니다. 파이썬에서는 str 하고 int 타입이 구분되어있어 입력을 정수의 배열로 받고, 난이도 1을 확인할 때 count 함수를 쓴 것 정도를 제외하면 코드 구성은 거의 동일하다고 생각됩니다.
정수형으로 숫자 받을 때 양 옆의 공백도 혹시 몰라서 제거 했고요.
c++코드를 파이썬으로 옮기는 과정에서 무엇이 잘못되었을까요?
snowas
일단 코드는 다음과 같습니다.
~~~ python3
import os
import sys
N = []
def classify(beg, end):
global N
M = N[beg:end]
INF = 987654321
cache = [None]
def memorize(beg):
global N, INF, cache
if beg == len(N):
return 0
T = int(input().strip())
for _ in range(T):
N = [int(i) for i in input().strip()]
cache = [None] * (len(N) + 2)
answer = memorize(0)
print(answer)
9년 전