Recent Posts
                                        
                                    
                                    
                                        Recent Comments
                                        
                                    
                                    
                                        Link
                                        
                                    
                                | 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 | 
| 9 | 10 | 11 | 12 | 13 | 14 | 15 | 
| 16 | 17 | 18 | 19 | 20 | 21 | 22 | 
| 23 | 24 | 25 | 26 | 27 | 28 | 29 | 
| 30 | 
                                        Tags
                                        
                                    
                                    - go
 - gradle
 - 문제풀이
 - 프로그래머스
 - Linux
 - 스칼라
 - 알고리즘
 - redis
 - 튜토리얼
 - 파이썬
 - zookeeper
 - golang
 - 리눅스
 - 자바
 - 주키퍼
 - programmers
 - codewars
 - docker
 - Java
 - 동적프로그래밍
 - OOM
 - DP
 - Go언어
 - dynamic programming
 - boj
 - scala
 - 코드워
 - leetcode
 - Python
 - HBase
 
                                        Archives
                                        
                                    
                                    - Today
 
- Total
 
파이문
1463. 1로 만들기 본문
728x90
    
    
  1463. 1로 만들기
(https://www.acmicpc.net/problem/1463)
동전 경우의 수 구하는 문제랑 비슷하다. 다만 앞에서 하는게 아니라 뒤에서 풀어야 풀린다. (다른 방법은 잘 모르겠음)
예를 들어서 8이 주어지면 8에서 만들 수 있는 수는 8-1, 8/2 두 가지이다. 이 때 나오는 수인 7, 4를 인덱스로 가지는 dp 에 1을 넣어준다. 이것이 맨 처음에 1을 넣어주는 부분이다. (초기화를 n-1하는 이유는 어떤 수 n에서 1을 만드는 가장 최댓값이 n-1이기 때문이다.)
그리고 그 다음 7부터 거꾸로 dp를 만들어 주면 된다. (인덱스) i에서 i/2, i/3, i-1에 i를 만들수 있는 값 + 1과 해당 값의 최솟값만 갱신해 주고, 목표가 1을 만드는 것이기 때문에 dp의 1번째를 리턴해주면 된다.
import java.util.Scanner;
public class Main {
    public int problem1464(int n) {
        int[] dp = new int[n];
        if (n == 1) {
            return 0;
        }
        for (int i = 0; i < n; ++i) {
            dp[i] = n-1;
        }
        if (n - 1 >= 0) {
            dp[n - 1] = 1;
        }
        if (n % 2 == 0) {
            dp[n / 2] = 1;
        }
        if (n % 3 == 0) {
            dp[n / 3] = 1;
        }
        for (int i = n - 1; i > 0; --i) {
            dp[i - 1] = Math.min(dp[i] + 1, dp[i - 1]);
            if (i % 2 == 0) {
                dp[i / 2] = Math.min(dp[i] + 1, dp[i / 2]);
            }
            if (i % 3 == 0) {
                dp[i / 3] = Math.min(dp[i] + 1, dp[i / 3]);
            }
        }
        return dp[1];
    }
    public static void main(String[] args) {
        // Use the Scanner class
        Main sol = new Main();
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.println(sol.problem1464(n));
    }
}
'문제 풀이 > BOJ' 카테고리의 다른 글
| 11053. 가장 긴 증가하는 부분 수열 (0) | 2017.11.12 | 
|---|---|
| 2579. 계단 오르기 (0) | 2017.11.12 | 
| 1149. RGB 거리 (0) | 2017.04.04 | 
| 1003. 피보나치 함수 (0) | 2017.04.03 | 
| Maximum Random Walks (0) | 2016.04.17 | 
                          Comments