언어/c, c++

(백준BAEKJOOB )- 1463번 -1로 만들기 "c++"

깡 딱 2023. 3. 1. 12:17
728x90

 

개인적으로 너무 어려웠다 dp에 익숙하지 않아서 그런지 모르겠지만 나한테 좀 많이 어려웠다.

문제를 풀기위해서는 dp알고리즘이 어떤 형식인지 알아야되고

 

문제에 있는 설명  3개를 이용하면 점화식 3개가 나오는데

dp[x/3]+1
dp[x/2]+1
dp[x-1]+1

이걸이용하여 풀도록 하겠다.

먼저 0부터 4까지 넣어보면 0 0 1 1이고 5부터는 값이 달라진다

 

그러면 

	d[0], d[1] = 0;
	d[2], d[3] = 1;

일단 적어주고 

 

그러면 i가 4부터 시작하는 반복문을 만들어주고 점화식을 이용해 값들을 넣어준다.

	for (int i = 4; i <= n; i++) {
		d[i] = d[i - 1] + 1;
		if (i % 2 == 0) d[i] = min(d[i], d[i / 2] + 1);
		if (i % 3 == 0) d[i] = min(d[i], d[i / 3] + 1);
	}

min은 #include <algorithm>이걸 꼭 넣어줘야만 돌아간다.

ex>> min(1,2)  -> 작은 값을 반환해줌 

 

 

풀이를 봐도 이해가 안된다 .그래서 따로 cout을 다해봤다  10으로 예시를 들어보면

 

이런식으로 흘러가고 

i가 4일때만 한번 설명 해보겠다.

i가 4일때 d[4]=d[3]+1 결국 d[3]은 1이니까 d[4]의 값은 2가 나오고

i가 4일때 4%2==0 이성립이되니까 d[4]=min(d[4],d[2]+1) 더 작은값인 뒤에값 1을 출력

i가 4일때 4%3==0은 성립이 되지않기 때문에 넘어간다 

 

그럼 마지막까지 프로그램 되면 결국 a[10]은 3이라는 값이 나온다!

#include <iostream>
#include <algorithm>

using namespace std;

long d[1000001];

int main() {
    int n;
    cin >> n;

    d[0], d[1] = 0;
    d[2], d[3] = 1;

    for (int i = 4; i <= n; i++) {
        d[i] = d[i - 1] + 1;
        cout << "d[" << i << "] after first update: " << d[i] << endl;

        if (i % 2 == 0) {
            d[i] = min(d[i], d[i / 2] + 1);
            cout << "d[" << i << "] after second update: " << d[i] << endl;
        }

        if (i % 3 == 0) {
            d[i] = min(d[i], d[i / 3] + 1);
            cout << "d[" << i << "] after third update: " << d[i] << endl;
        }
    }

    cout << "Minimum number of operations to reach " << n << ": " << d[n] << endl;
    return 0;
}

코드를 이용하여 어떤식으로 만들어지는지 직접 해보자

 

 

 

총 코드

#include <iostream>
#include <algorithm>

using namespace std;



int d[1000001];
int main(){
	int n;
	cin >> n;

	d[0]=0,d[1] = 0;
	d[2]=1, d[3] = 1;


	for (int i = 4; i <= n; i++) {
		d[i] = d[i - 1] + 1;
		if (i % 2==0) d[i] = min(d[i], d[i / 2] + 1);
		if (i % 3==0) d[i] = min(d[i], d[i / 3] + 1);
	}
	cout << d[n] << endl;
}

 

728x90