채점 방식 : 

입력 케이스들은 다음과 같은 종류로 구별되며, 한 종류의 케이스를 다 맞혀야 그 종류에 배정된 점수를 받을 수 있다.

또한 제한시간이 1초이며 최대 256MB이라는 메모리 제한이 있다.


종류 1 : K ≤ 10

종류 2 : K ≤ 1000

종류 3 : 추가적인 제한 조건이 없음


종류 1은 수월하게 통과되는데 종류 2 조건에서 런 타임 에러 혹은 메모리 제한 초과가 떠서 
DP 메모이제이션이나 반복문으로 바꿀라고 노력했는데 잘 안되는 것 같습니다..
아래 전체 코드입니다.

k가 조금만 높아지면 나오는 메모리 사용량이 계속 올라가는데..아직 배운지 얼마 안되서 잘 모르겠습니다..

def z(K, X):

    dp = [[0] * (K + 1) for _ in range(1 << K)]


    for x in range(1, 1 << K):

        dp[x][0] = float('inf')


    for k in range(1, K + 1):

        for x in range(1, 1 << K):

            if dp[x][k] == 0: 

                next_x_1 = (x + 1) & ((1 << K) - 1)

                next_x_2 = (x << 1) & ((1 << K) - 1)

                dp[x][k] = min(1 + dp[next_x_1][k - 1], 1 + dp[next_x_2][k - 1])


    return dp[int(X, 2)][K]


K = int(input())

X = input()

print(z(K, X))