알고리즘/프로그래머스

[프로그래머스]Lv2. 숫자 변환하기(Python)

cha_eyoon 2024. 2. 3. 18:30

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

 

프로그래머스

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

programmers.co.kr

 

문제 접근

 

이전에 풀었던 문제인 백준의 '1로 만들기'와 비슷하다고 생각했다. 

https://www.acmicpc.net/problem/1463

 

1463번: 1로 만들기

첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.

www.acmicpc.net

위의 문제를 풀 때 dp를 사용했던 기억이 있어서 이 문항도 dp를 사용하면 될 것이라고 생각했다.

 

추가고민(2/7)

우선 +n / *2 / *3 의 모든 경우가 가능하기 때문에  무한대로 초기화 있는 값을 만약 해당 경로가 가능하면 업데이트 해준다. 

 

코드

 

def solution(x, y, n):
    answer = 0

    dp = [1e9] * (y + 1)

    dp[x] = 0   # 시작점 x의 연산 횟수는 0

    # dp[i] = 자연수 i에 도달하기 위한 최소 연산 횟수
    for i in range(x, y + 1):
        if i + n <= y:
            dp[i + n] = min(dp[i + n], dp[i] + 1)

        if i * 2 <= y:
            dp[i * 2] = min(dp[i * 2], dp[i] + 1)

        if i * 3 <= y:
            dp[i * 3] = min(dp[i * 3], dp[i] + 1)

    # y 위치의 값이 초기값이라면, x=>y인 경로가 없다는 의미 
    if dp[y] == 1e9:
        return -1

    return dp[y]

 

문제 회고

 

처음 문제를 보고 dp라는 직감은 왔지만 dp 테이블을 무작정 0으로 초기화했다.

 

1. dp 테이블을 큰 수로 초기화한 경우:

아직 방문하지 않은 위치의 dp 값은 그대로 큰 수(-1 리턴), 도달하면 dp[y]로 갱신

 

2. dp를 0으로 초기화한 경우:

그냥 저 아래의 조건문을 dp[y] == 0 으로만 바꿔주면 되는거 아닌가? 라고 생각

하지만 dp[y] == 0인 상황은 두 가지!

(1) y 위치에 도달하지 못한 경우 

(2) y 위치에 도달하는 데 필요한 연산 횟수가 실제로 0인 경우 

=> 그렇기 때문에 dp테이블을 0으로 초기화하면 y 위치의 도달여부를 정확히 판단할 수 없다.