PS

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

요다다 2023. 8. 26. 04:02

https://school.programmers.co.kr/learn/courses/30/lessons/154538#qna

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제를 보고, 처음에 그리디를 생각했는데 그리디 문제가 아니였다

그래서 dp를 생각하고 아래와 같이 풀었으나 75점을 받게 됐다.

#### 1차 풀이 => 75점 ####
def solution(x, y, n):
    answer = 0
    dp = [1000001]*(y+1)
    dp[x] = 0

    for i in range(x+1,y+1):
        if i % (x*6) == 0:
            dp[i] = min(dp[i//2], dp[i//3])+1
        elif i % (x*2) == 0:
            dp[i] = dp[i//2]+1       
        elif i % (x*3) == 0:
            dp[i] = dp[i//3]+1
        if i-n >= 0:
            dp[i] = min(dp[i], dp[i-n]+1)
   
    return dp[y] if dp[y] != 1000001 else -1

ㅎㅎ... 도저히 틀린 케이스를 찾을 수 없어서 다른 분들의 풀이를 참고하였다..

#### sol / 정답풀이
def solution(x, y, n):
    answer = 0
    memorize = [1e9] * (y+1)
    memorize[x] = 0
    for i in range (x, y+1):
        if i + n <= y:
            memorize[i+n] = min(memorize[i+n], memorize[i] + 1)
        if i * 2 <= y:
            memorize[i*2] = min(memorize[i*2], memorize[i] + 1)
        if i * 3 <= y:
            memorize[i*3] = min(memorize[i*3], memorize[i] + 1)
    
    if memorize[y] == 1e9:
        return -1
    return memorize[y]

이런 방법을 왜 생각 못 했을까.. dp 넘 어렵당

i번째에서 i+n, i*2, i*3 케이스를 모두 구해 해당 인덱스 위치에 넣어주는 것이다.

나는 i번째일 때, i번째 인덱스 값만 구했기 때문에 이 알고리즘이 훨씬 효율적인 것을 확인할 수 있었다.

 

'PS' 카테고리의 다른 글

[소프티어] 징검다리 -level3  (1) 2023.12.30
백준 양 파이썬 / sol  (0) 2023.12.19
배낭 문제(Knapsack Problem)  (0) 2023.04.09
이분 탐색(Binary search) 개념  (0) 2023.03.25