ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ DP ] 1로 만들기
    알고리즘/이코테 - 실전 2021. 8. 23. 18:19

    난이도 : 중하  풀이시간 : 20분  시간제한 : 1초 

    [ DP ] 1로 만들기

    정수 X가 주어질 때 정수 X에 사용할 수 있는 연산은 다음과 같이 4가지 이다.

    1. X가 5로 나누어 떨어지면 5로 나눈다.
    2. X가 3으로 나누어 떨어지면 3으로 나눈다.
    3. X가 2로 나누어 떨어지면 2로 나눈다.
    4. X에서 1을 뺀다.

    정수가 주어졌을 때, 연산 4개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오

     

    :: 입력 조건

     

    • 첫째 줄에 정수 X가 주어진다.(1 <= X <= 30,000)

     

    :: 출력 조건

     

    • 첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.

     

     


     

      아이디어  

    특정 수 x를 1로 만드는 개념이 아니라

    2부터 시작해서 각수를 1로 만들 때 필요한 최소 횟수를 저장함

    반복문의 수가 x가 되었을 때 반복을 멈추고 출력

     

      내   코드  

    아이디어를 생각하지 못해서 답지 보고 클론 코딩함

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <string>
    
    using namespace std;
    
    #define endl "\n"
    
    int dp[30001];
    int x;
    
    int main() {
    	cin >> x;
    	for (int i = 2; i <= x; i++) {
    		
    		// 1을 빼는 경우
    		dp[i] = dp[i - 1] + 1;
    
    		// 2로 나뉘는 경우
    		if (i % 2 == 0) {
    			dp[i] = min(dp[i], dp[i / 2] + 1);
    		}
    
    		// 3으로 나뉘는 경우
    		if (i % 3 == 0) {
    			dp[i] = min(dp[i], dp[i / 3] + 1);
    		}
    
    		//5로 나뉘는 경우
    		if (i % 5 == 0) {
    			dp[i] = min(dp[i], dp[i / 5] + 1);
    		}
    	}
    
    	cout << dp[x] << endl;
    }

     

      정답  코드  

    #include <bits/stdc++.h>
    
    using namespace std;
    
    // 앞서 계산된 결과를 저장하기 위한 DP 테이블 초기화 
    int d[30001];
    int x;
    
    int main(void) {
        cin >> x;
        // 다이나믹 프로그래밍(Dynamic Programming) 진행(보텀업)
        for (int i = 2; i <= x; i++) {
            // 현재의 수에서 1을 빼는 경우
            d[i] = d[i - 1] + 1;
            // 현재의 수가 2로 나누어 떨어지는 경우
            if (i % 2 == 0)
                d[i] = min(d[i], d[i / 2] + 1);
            // 현재의 수가 3으로 나누어 떨어지는 경우
            if (i % 3 == 0)
                d[i] = min(d[i], d[i / 3] + 1);
            // 현재의 수가 5로 나누어 떨어지는 경우
            if (i % 5 == 0)
                d[i] = min(d[i], d[i / 5] + 1);
        }
        cout << d[x] << '\n';
    }

     

    '알고리즘 > 이코테 - 실전' 카테고리의 다른 글

    [ DP ] 바닥 공사  (0) 2021.08.23
    [ DP ] 개미전사  (0) 2021.08.23
    [ 이진탐색 ] 떡볶이 떡 만들기  (0) 2021.08.10
    [ 이진탐색 ] 부품 찾기  (0) 2021.08.10
    [ 정렬 ] 두 배열의 원소 교체  (0) 2021.08.10
준생e