Algorithm/BAEKJOON

[C#]백준 1463 1로 만들기 - Hide

zz0zz9 2024. 11. 26. 22:32
반응형
반응형

https://www.acmicpc.net/problem/1463

문제 요약

세 종류의 연산을 이용해서 주어진 수를 1로 만들 때 필요한 연산의 최소 횟수 출력하기

 

 

 

참고

주어진 연산들을 이용해 i를 1로 만드는 연산의 최소 횟수는

(i-1의 최소 횟수+1, %2나%3을 사용해 1로 만드는 연산의 최소 횟수) 두 가지 경우가 있고,

두 경우 중 더 작은 수를 고르면 된다.

i i-1을 먼저 했을 경우 횟수 %2이나 %3을 먼저 했을 경우 횟수 최소 횟수
0         0
1         0
2 1 1 1 1 1
3 2->1 2 1 1 Math.Min(2, 1) => 1
4 3->1 2 2->1 2 2
5 4->3->1, 4->2->1 3     3
6 5->4->3->1, 5->4->2->1 4 3->1, 2->1 2 Math.Min(4, 2) => 2
7 6->3->1, 6->2->1 3     3
8 7->6->3->1, 7->6->2->1 4 4->3->1, 4->2->1 3 Math.Min(4, 3)=> 3
9 8->4->3->1, 8->4->2->1 4 3->1 2 Math.Min(4, 2) => 2
10 9->3->1 3 5->4->3->1, 5->4->2->1 4 Math.Min(3, 4) => 3

 

 

 

풀이
int n=int.Parse(Console.ReadLine());
var a=new int[n+1];
for(int i=1;i++<n;)
{
    a[i]=a[i-1]+1;
    if(i%2==0)a[i]=Math.Min(a[i],a[i/2]+1);
    if(i%3==0)a[i]=Math.Min(a[i],a[i/3]+1);
}
Console.Write(a[n]);

예제 2의 경우 0부터 10까지 각각의 i를 1로 만드는 연산의 최소 횟수를 담은 배열 = {0,0,1,1,2,3,2,3,3,2,3}이 된다.

 

 

 

숏코딩
더보기
int n=int.Parse(Console.ReadLine()),i=1;var a=new int[n+1];
for(;i++<n;)a[i]=Math.Min(a[i-1],Math.Min(i%2==0?a[i/2]:int.MaxValue,i%3==0?a[i/3]:int.MaxValue))+1;Console.Write(a[n]);

이게 DP???? 너무 똑똑한걸..?

반응형