[๋ฌธ์ ]
https://www.acmicpc.net/problem/1463
์ ์ x ๊ฐ ์ฃผ์ด์ก์ ๋, x ๋ฅผ 1๋ก ๋ง๋๋ ์ต์ ์ฐ์ฐ์ ์๋ฅผ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
x ๋ฅผ 1๋ก ๋ง๋๋ ์ฐ์ฐ์ 3๊ฐ์ง๊ฐ ์๋ค.
1) x ๊ฐ 3 ์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ฉด x ๋ฅผ 3 ์ผ๋ก ๋๋๋ค.
2) x ๊ฐ 2 ๋ก ๋๋์ด ๋จ์ด์ง๋ฉด x ๋ฅผ 2 ๋ก ๋๋๋ค.
3) 1)2) ๊ฐ ์๋๋ฉด x ์์ 1์ ๋บ๋ค.
์ ์ x ๊ฐ์ ๋ฒ์๋ 1 ≤ x ≤ 10^6 ์ด๋ค.
์ ํ์๊ฐ์ 0.15์ด ์ด๋ค.
[ํ์ด]
์ ์ x ์ ์ต๋๊ฐ์ด 10^6 ์ด๊ธฐ ๋๋ฌธ์ O(n^2) ๋ง ๋์ด๋ ๋ฌธ์ ์ ์ ํ์๊ฐ์ ๋๊ธด๋ค. ์ฆ, ์์ ํ์์ผ๋ก ํ๋ฉด ์๋๋ค.
์ ํ์์ ์ฐพ์์ผ ํ๋ค.
'D[x] = x๋ฅผ 1๋ก ๋ง๋๋ ์ต์ ์ฐ์ฐ์ ์' ๋ผ๊ณ ๋๊ณ D[1] ๋ถํฐ ๊ตฌํด๋ณด์.
D[1] = 1
D[2] = D[2/2] = 1
D[3] = D[3/3] = 1
D[4] = D[4/2] = D[2] = D[2/2] = 1
D[4] ๊น์ง๋ง ๊ตฌํด๋ด๋ D[2] ๋ฅผ ์ฌ์ฌ์ฉํจ์ ์ ์ ์๋ค.
ํฐ ๊ฐ x๋ฅผ ์์ ๊ฐ๋ค์ ์ด์ฉํด์ ํ ์ ์๋ ๋ฌธ์ . DP ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ ์ ์๋ค.
๋ฐ๋ผ์ D[x] ์ ์ ํ์์ D[x] = min(D[x/3] + 1, D[x/2] + 1, D[x-1] + 1) = min(D[x/3], D[x/2], D[x-1]) + 1 ์ด๋ค.
๋ค๋ง, x๊ฐ 3์ผ๋ก ๋๋์ด๋จ์ด์ง๋ ๊ฒฝ์ฐ, 2๋ก ๋๋์ด๋จ์ด์ง๋ ๊ฒฝ์ฐ, 3์ด๋ 2๋ก ๋๋์ด ๋จ์ด์ง์ง ์๋ ๊ฒฝ์ฐ๊น์ง ์ด 3๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๋ฏ๋ก ๋๋ ์ ์ต์๊ฐ์ ๊ตฌํด์ผ ํ๋ค.
1) Top-down ๋ฐฉ์
int go(int n){
if(n == 1) return 0;
if(d[n] > 0) return d[n];
d[n] = go(n-1) + 1;
if(n%2 == 0) d[n] = min(d[n], go(n/2) + 1);
if(n%3 == 0) d[n] = min(d[n], go(n/3) + 1);
return d[n];
}
์๊ฐ๋ณต์ก๋: O(n)
2) Bottom-up ๋ฐฉ์
d[1] = 0;
for(int i = 2; 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);
}
์๊ฐ๋ณต์ก๋: O(n)
[์ฝ๋]
//Top-down ๋ฐฉ์
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX_SIZE = 1000001;
int d[MAX_SIZE]; // d[x] = x๋ฅผ 1๋ก ๋ง๋๋ ์ต์ ์ฐ์ฐ์ ์.
int go(int x);
int main() {
int x;
cin >> x;
cout << go(x) << "\n";
return 0;
}
int go(int x) {
if (x == 1) return 0;
if (d[x] > 0) return d[x];
d[x] = go(x - 1) + 1;
if (x % 3 == 0) d[x] = min(d[x], go(x / 3) + 1);
if (x % 2 == 0) d[x] = min(d[x], go(x / 2) + 1);
return d[x];
}
//Bottom-up ๋ฐฉ์
#include <iostream>
#include <algorithm>
using namespace std;
int go(int x);
int main() {
int x;
cin >> x;
cout << go(x);
return 0;
}
int go(int x) {
int* d = new int[x + 1] {0, };
d[1] = 0;
for (int i = 2; i <= x; 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);
}
return d[x];
}
* DP ๊ฐ๋ ๋ฐ ํ์ด๋ฒ ์ ๋ฆฌ
https://i-believe-in-me.tistory.com/413
'๐ Coding Test Study > Algorithm Problem' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][C++] 1269 ๋์นญ ์ฐจ์งํฉ(feat. ์ด๋ถํ์) (0) | 2024.05.25 |
---|---|
[C++][BOJ] 2343 ๊ธฐํ ๋ ์จ (feat. ์ด๋ถํ์) (0) | 2024.05.23 |
[C++][BOJ] 2792๋ฒ ๋ณด์ ์์(feat. ์ด๋ถ ํ์) (0) | 2024.05.21 |
[C++][BOJ] 9935 ๋ฌธ์์ด ํญ๋ฐ :: ๋ฌธ์์ด ๋น๊ต(stack, erase) (0) | 2024.05.15 |
[C++][BOJ] 1931 ํ์์ค ๋ฐฐ์ :: ๋ผ์ธ ์ค์ํ (0) | 2024.05.15 |