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

쿼카쿼카·2023년 4월 7일
0

알고리즘

목록 보기
49/67

문제

코드

function solution(x, y, n) {
    if (x === y) return 0;

    const dp = {};

    dp[x] = 0;

    let data = [x];

    while (data.length) {
        const newData = [];

        for (const d of data) {
            for (const e of [d + n, d * 2, d * 3]) {
                console.log(d, e, dp);
                if (e > y || dp[e]) continue;
                if (e === y) return dp[d] + 1;
                dp[e] = dp[d] + 1;
                newData.push(e);
            }
        }
        data = newData;
    }

    return -1;
}

시간초과 된 내 풀이

  • 나름 머리 써서 y에서 x로 돌아가는 방법으로 풀었어요! (현재 숫자가 2나 3으로 나누어 떨어지지 않으면 절차를 생략해도 되니까요!) 진짜 어쩜 이렇게 똑똑할까
  • 물론 시간초과구요~

dp를 이용한 풀이

  • dp를 만들어 두고, 숫자가 지날 때마다 그 숫자 속성에 이전 move count에서 +1을 한 값을 value로 넣어줘요
  • 이중 포문을 위해 data 배열을 선언해요

여기서 꿀팁! for문이 제일 빠르대서 항상 일반 for만 썼는데 for of랑 forEach도 충분히 빠르다고 하니 많관부

  • 두 번째 포문에 날 것으로 [d+2, d*2, d*3]을 넣어준 것이 감명 깊었어요.
  • dp[e]가 있거나 값을 초과하면 continue
  • dp[e]가 없으면 현재 move count인 dp[d]값에 +1을 하여 할당
  • e === y 면 원하는 답이니까 return dp[d]+1을 해줘요!
  • 다 돌았는데 안 나온다? 그럼 -1
profile
쿼카에요

0개의 댓글