• Home
  • About
    • KKsDev photo

      KKsDev

      게임 프로그래머를 목표로 Unity, C#을 공부하고 있습니다.

    • Learn More
    • Email
    • Github
    • Steam
  • Posts
    • All Posts
    • All Tags
  • Projects

내일배움캠프 49일차 TIL DP 사용

02 Oct 2023

Reading time ~1 minute

오늘 배운 내용

  1. 숫자 변환하기



nbcbanner

숫자 변환하기

이번 주 첫 TIL은 프로젝트가 아직 정리가 안된거 같아서 코드카타때 푼 문제로 작성해야 될 것 같다.

이번 문제는 자연수 x를 세 가지 연산을 사용해서 y로 만들때 최소한으로 연산을 사용한 경우의 수의 연산 횟수를 구하는 문제 였다.


문제를 보자마자 딱 DP가 떠올랐고, 세가지 연산을 비교해서 가장 횟수가 적은 것을 계속해서 DP에 저장하면서

상향식으로 문제를 해결할 수 있을것이라는 생각이 들었다.


using System;

public class Solution {
    //dp문제?
    
    // dp[5] = dp[5 - n] + 1 or dp [5 / 2 ] + 1 or dp [5 / 3] + 1
    public int solution(int x, int y, int n) 
    {
        int[] dp = new int[y+1];
        
        for(int i =0; i<y+1; i++){
            dp[i] = -1;
        }
        
        dp[x] = 0;
        
        for(int i= x+1; i <= y; i++)
        {
            int caculateN= int.MaxValue;
            int caculate2= int.MaxValue;
            int caculate3 = int.MaxValue;
            
            if (i > n && dp[i-n] != -1)
            {
                caculateN = dp[i-n] + 1;
            }
            
            if (i % 2 == 0 && dp[i/2] != -1)
            {
                caculate2 = dp[i/2] + 1;
            }
            
            if (i % 3 == 0 && dp [i/3] != -1)
            {
                caculate3 = dp[i/3] + 1;    
            }
                
            
            int min = Math.Min(caculateN, Math.Min(caculate2, caculate3));
            
            if (min == int.MaxValue)
            {
                dp[i] = -1;
            }
            else{
                dp[i] = min;
            }
            
            
        }
        
        
        return dp[y];
    }
}

만들수 없는 수들은 제외를 해야하기 때문에 배열을 먼저 -1로 초기화하고

시작수인 x에 0을 넣으면서 y까지 반복하면서 상향식으로 dp 배열을 채워나갔다.

만들지 못하는 수 즉, dp배열이 -1인 수는 무시하고 만들 수 있는 수라면


횟수를 +1 해서 저장하였고 3가지 방법중 가장 최적인 수를 계속해서 저장하여 문제를 해결했다.

nbcthumbnail



TIL내일배움캠프스파르타 Share Tweet +1