본문 바로가기

알고리즘/초급1

[JAVA] 백준 1463번: 1로 만들기 (초급 1-10)

문제

정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.

  1. X가 3으로 나누어 떨어지면, 3으로 나눈다.
  2. X가 2로 나누어 떨어지면, 2로 나눈다.
  3. 1을 뺀다.

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

입력

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

출력

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

 

문제 풀이

문제 풀이 1)

1이 될 때 까지의 모든 연산 ( -1 , /3, /2)계속해서 진행하는 방법이다.

 

count는 연산 횟수를 의미한다.

 

예시 문제로 주어진 10에 대한 문제를 풀어보자.

 

10이 주어진다면

-1과 /2 연산이 가능하며

q에는 연산 결과인 9와 5가 추가된다.

q = { 9, 5}

연산 횟수는 1번이다.

 

q에 제일앞에 있는 값을 다시 계산한다.

q에서 제일 앞에 있는 값이 9가 주어졌다.

-1과 /3 연산의 결과인 {8, 3} 이 새롭게 q에 추가될 것이고

{8, 3} 의 count 값은 2가 될 것이다.

현재 q는 {5, 8, 3} 으로 구성되어 있다.

 

q가 모두 없어질 때 까지 위의 연산을 반복해서 진행하며, count 값을 1씩 높여주면 된다.

 

코드를 확인해보자.

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class baekjoon1463_2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Number number = new Number(n, 0);

        Queue<Number> q = new LinkedList<>();
        q.add(number);

        while (!q.isEmpty()) {
            Number temp = q.remove();
            int num = temp.num;
            int count = temp.count;
            if (num == 1) {
                System.out.println(count);
                break;
            }

            if (num % 3 == 0) {
                q.add(new Number(num / 3, count + 1));
            }
            if (num % 2 == 0) {
                q.add(new Number(num / 2, count + 1));
            }
            q.add(new Number(num - 1, count + 1));
        }
    }
}

class Number {
    int num;
    int count;

    Number(int num, int count) {
        this.num = num;
        this.count = count;
    }
}

 

 

문제 풀이 2)

dp[i] = i를 1로 만드는 최소 연산 횟수를 계산하는 방식이다.

 

1을 1로 만드는 최소 연산 횟수는 0번이겠죠? 

 

2를 1로 만드는 방법은 두가지가 있습니다.

2에서 1을 빼서 만드는 방법: dp[2] = dp[1] +1

2에서 2를 나눠서 만드는 방법: dp[2] = dp[i/2] + 1

 

코드는 아래에서 확인할 수 있습니다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.ArrayList;
import java.lang.Math;

public class Main{
    public static void main(String[] args) throws IOException {
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       int number = Integer.parseInt(br.readLine());
       int dp[] = new int[number+1];
       dp[0] = 0;
       dp[1] = 0;
       for (int i = 2; i <= number; i++){
           dp[i] = dp[i-1] + 1;
           if (i % 2 == 0) dp[i] = Math.min(dp[i], dp[i/2] + 1);
           if (i % 3 == 0) dp[i] = Math.min(dp[i], dp[i/3] + 1);
       }
       System.out.println(dp[number]);
       br.close();
       
    }
}