Algorithm/프로그래머스

[프로그래머스 파이썬] 숫자 변환하기

devKen 2023. 2. 23. 15:46
def solution(x, y, n):
    answer = 0
    dp = [1e9 for _ in range(y+1)]
    dp[x] = 0

    for i in range(x + 1, y + 1):
        if i//3 >= x and i % 3 == 0 and dp[i//3] != 1e9:
            dp[i] = min(dp[i], dp[i//3]+1)
        if i//2 >= x and i % 2 == 0 and dp[i//2] != 1e9:
            dp[i] = min(dp[i], dp[i//2]+1)
        if i-n >= x and dp[i-n] != 1e9:
            dp[i] = min(dp[i], dp[i - n]+1)

    answer = dp[y]
    if answer == 1e9:
        answer = -1
    return answer

아이디어

처음에는 브루트포스로 while문을 돌려서 해결하려고 했다가 눈치를 챘다. DP다 코인 2, 3, 5로 최소 횟수 세는거랑 비슷한 문제이다.

 

해답

 

- 첫번째 시도

import sys

def solution(x, y, n):
    answer = 0
    dp = [1e9 for _ in range(y+1)]
    dp[x] = 0
    for i in range(x + 1, y + 1):
        if i >= x * 3:
            dp[i] = min(dp[i], dp[i - x * 2] + 1)
        if i >= x * 2:
            dp[i] = min(dp[i], dp[i - x] + 1)
        if i >= x + n:
            dp[i] = min(dp[i], dp[i- n]  + 1)
        
    answer = dp[y]
    if answer == 1e9:
        answer = -1
    return answer

잘 동작하는 것처럼 보이지만 막상 제출하면 50%만 맞추고 다 틀려버린다. 뭔가 이상하다는건 알겠는데 원인을 몰라서 시간이 엄청나게 오려 걸려버렸다.

- 두번째 시도

사실 두번째는 아니고 10번째 시도정도는 되겠다. 내가 코드를 고치다가 0부터 x까지 전부 1e9로 초기화 하는 방법을 시도한 적이 있는데 이 방법으로 3번은 더 틀린거 같다. DP를 사용할 때 주어진 수를 초기화 하는것에 집중해야지 그 전까지 넣으면 로직상 꼬일수도 있다...

- i//3이 정확하게 해당 인덱스를 가르키는지 확인하기 위해 i % 3으로 떨어지는지 확인

- x보다 큰지를 확인하는 것을 넣었는데 지금 보니까 딱히 필요 없는거 같다.

- 다만 체크하는 녀석이 1e9인지 아니면 다른 것인지는 확인해줘야한다. 우리의 연산은 항상 dp[x]에서 출발하는 것이기 떄문에 이 숫자에 근거하지 않으면 안 되기 때문이다.

def solution(x, y, n):
    answer = 0
    dp = [1e9 for _ in range(y+1)]
    dp[x] = 0

    for i in range(x + 1, y + 1):
        if i//3 >= x and i % 3 == 0 and dp[i//3] != 1e9:
            dp[i] = min(dp[i], dp[i//3]+1)
        if i//2 >= x and i % 2 == 0 and dp[i//2] != 1e9:
            dp[i] = min(dp[i], dp[i//2]+1)
        if i-n >= x and dp[i-n] != 1e9:
            dp[i] = min(dp[i], dp[i - n]+1)

    answer = dp[y]
    if answer == 1e9:
        answer = -1
    return answer