View
https://www.acmicpc.net/problem/1463
📚 문제
정수 N이 주어졌을 때, 아래의 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.
1. X가 3으로 나누어 떨어지면, 3으로 나눈다.
2. X가 2로 나누어 떨어지면, 2로 나눈다.
3. 1을 뺀다.
예제 입력 | 예제 출력 |
2 | 1 |
10 | 3 |
📝 문제 해결
무조건 큰 수로 답을 나눈다고 답이 아니었다. 예를 들어
10 (/2) > 5(-1) > 4(/2) > 2(-1) = 1 : 4번
10(-1) > 9(/3) > 3(/3) = 1 : 3번
각 부분에서 최솟값을 찾아 dp를 갱신해줘야 한다.
📍 접근방법
테이블 정의
dp[i] : 정수가 i를 1로 만들 때 연산을 사용하는 횟수의 최솟값
점화식 찾기
- 3으로 나누기 dp[6] = dp[2]+1 = dp[i/3]+1
- 2로 나누기 dp[6] = dp[3]+1 = dp[i/2]+1
- 1을 빼기 dp[6] = dp[5]+1 = dp[i-1]+1
중 최솟값 저장
초기값 정의
dp[0] = dp[1] = 0
💻 코드
import java.util.Scanner;
public class BOJ1463 {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
int dp[] = new int[x+1];
dp[0] = dp[1] = 0;
for (int i = 2; i <= x; 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[x]);
}
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[그리디] 백준 1543번 문서 검색(Java) (0) | 2022.10.17 |
---|---|
[그리디] 백준 11000번 강의실 배정(Java) (0) | 2022.10.10 |
[그리디] 백준 13458번 시험 감독(Java) (0) | 2022.10.10 |
reply