1463번: 1로 만들기
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
www.acmicpc.net
[문제 풀이]
DP를 이용하여 문제를 풀었습니다.
이 문제는 숫자가 주어 졌을 때 아래와 같은 세가지 규칙을 이용하여 x가 1로 가는 최소 연산의 횟수가 몇번인지를 찾는 문제입니다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 1을 뺀다.
문제를 풀기 위하여 DP를 이용하였습니다. 문제에 사용 된 점화 식은 아래와 같습니다.
arr[i] = arr[i-1] + 1;
if(i % 2 == 0){
arr[i] = Math.min(arr[i], arr[i/2] + 1);
}
if(i % 3 == 0){
arr[i] = Math.min(arr[i], arr[i/3] + 1);
}
문제를 푸는 방법은 1 ~ X까지의 연산 최소 횟수를 메모제이션 해줍니다. 메모제이션 하는 방법은 i 번째 수의 값이 (arr[i/2] + 1, arr[i/3] + 1, arr[i-1] + 1) 세개의 값을 비교하여 가장 작은 값을 기록하는 방법입니다. 메모제이션이 끝나면 배열의 X번째 인덱스의 값을 출력합니다.
[코드]
import java.io.*;
import java.util.*;
class Main{
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int[] arr = new int[x + 1];
arr[1] = 0;
for(int i = 2; i <= x; i++) {
arr[i] = arr[i-1] + 1;
if(i % 2 == 0){
arr[i] = Math.min(arr[i], arr[i/2] + 1);
}
if(i % 3 == 0){
arr[i] = Math.min(arr[i], arr[i/3] + 1);
}
}
System.out.println(arr[x]);
}
}
'algorithm > BOJ' 카테고리의 다른 글
백준 1197_최소 스패닝 트리(JAVA) (0) | 2021.04.23 |
---|---|
백준 2156_포도주 시식(JAVA) (0) | 2021.04.23 |
백준 1717_집합의 표현(JAVA) (0) | 2021.04.16 |
백준 1926_그림(JAVA) (0) | 2021.04.14 |
백준 2583_영역 구하기(JAVA) (0) | 2021.04.09 |