728x90
문제
https://www.acmicpc.net/problem/1463
3줄 요약
- 동적 계획법을 이용하여, 각 수에 대해 2로 나누기, 3으로 나누기, 1 빼기 중 최소 연산 횟수를 선택하여 메모이제이션 배열에 저장합니다.
- memo[i] = min(memo[i/2], memo[i/3], memo[i-1]) + 1의 점화식을 사용하여 계산합니다.
- N에 대한 최소 연산 횟수를 출력합니다.
코드
// package boj1463;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
// 입력 파일에서 데이터 읽기 (테스트용)
// System.setIn(new FileInputStream("src/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 정수 N 입력받기
int N = Integer.parseInt(br.readLine());
br.close();
// 메모이제이션을 위한 배열 초기화
int[] memo = new int[1_000_001];
// 동적 계획법을 이용하여 최소 연산 횟수 계산
for (int i = 2; i <= N; i++) {
int minCount = Integer.MAX_VALUE;
// 2로 나누어 떨어지는 경우
if (i % 2 == 0) {
minCount = Math.min(minCount, memo[i / 2]);
}
// 3으로 나누어 떨어지는 경우
if (i % 3 == 0) {
minCount = Math.min(minCount, memo[i / 3]);
}
// 1을 빼는 경우
minCount = Math.min(minCount, memo[i - 1]);
// 현재 수에 대한 최소 연산 횟수 저장
memo[i] = minCount + 1;
}
// 결과 출력
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write(Integer.toString(memo[N]));
bw.flush();
bw.close();
}
}
'Problem_Solving' 카테고리의 다른 글
백준(BOJ) 2579 : 계단 오르기 (실버3) / 자바(Java) 풀이 (0) | 2024.05.06 |
---|---|
백준(BOJ) 11726 : 2×n 타일링 (실버3) / 자바(Java) 풀이 (0) | 2024.05.06 |
백준(BOJ) 9095 : 1, 2, 3 더하기 (실버3) / 자바(Java) 풀이 (0) | 2024.05.04 |
백준(BOJ) 2512 : 예산 (실버2) / 자바(Java) 풀이 (0) | 2024.05.03 |
백준(BOJ) 1654 : 랜선 자르기 (실버2) / 자바(Java) 풀이 (0) | 2024.05.02 |