baekjoon/DP
백준 1436번 : 1로 만들기 자바
Meluu_
2024. 8. 15. 10:58
🧫 문제 분석
✔️ 출처
📖 문제

3으로 나눴을 때
2로 나눴을 때
1을 뺐을 때
3가지 경우 중 더 작은 값을 찾으면 된다.
6을 예시로 보면
6 / 3 의 최솟값 dp[6 / 3] + 1,
6 / 2 의 최솟값 dp[6 / 2] + 1,
6 - 1 의 최솟값 dp[6 - 1] + 1
dp[2] = 1, dp[3] = 1, dp[5] = 3
+1을 해주는 이유는 6에 대해 연산을 해주었기때문이다.
따라서 dp[6] = 2이다.
🔅 문제 풀이
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int[] dp = new int[n + 1];
dp[1] = 0;
for (int i = 2; i < dp.length; i++) {
dp[i] = dp[i - 1] + 1;
if (i % 3 == 0) {
dp[i] = Math.min(dp[i / 3] + 1,dp[i]);
}
if (i % 2 == 0) {
dp[i] = Math.min(dp[i / 2] + 1, dp[i]);
}
}
bw.write(dp[n]+"\n");
bw.flush();
bw.close();
}
}
❗ 오답노트 / 필요한 지식
- if - else 를 잘 구분해서 쓸 줄 알아야한다. 이 문제도 else를 붙여서 계속 틀렸던 것이다. else 를 써야할 때를 잘 생각해보고 사용하자.