1. ๊ทธ๋ฆฌ๋(Greedy)๋ 'ํ์'์ด๋ ์๋ฏธ
์ฆ, ๋งค ์๊ฐ ๊ฐ์ฅ ์ข์๋ณด์ด๋ ๊ฒ์ ์ ํํ๋ฉฐ, ํ์ฌ์ ์ ํ์ด ๋์ค์ ๋ฏธ์น ์ํฅ์ ๋ํด์๋ ๊ณ ๋ คํ์ง ์๋๋ค.
[์์ 1] ๊ฑฐ์ค๋ฆ๋
5585๋ฒ: ๊ฑฐ์ค๋ฆ๋
ํ๋ก๋ ์์ฃผ JOI์กํ์ ์์ ๋ฌผ๊ฑด์ ์ฐ๋ค. JOI์กํ์ ์๋ ์๋์ผ๋ก 500์, 100์, 50์, 10์, 5์, 1์์ด ์ถฉ๋ถํ ์๊ณ , ์ธ์ ๋ ๊ฑฐ์ค๋ฆ๋ ๊ฐ์๊ฐ ๊ฐ์ฅ ์ ๊ฒ ์๋์ ์ค๋ค. ํ๋ก๊ฐ JOI์กํ์ ์์ ๋ฌผ๊ฑด์ ์ฌ
www.acmicpc.net
์ ๊ทผ ๋ฐฉํฅ ๐ ๊ฐ์ฅ ํฐ ํํ ๋จ์๋ถํฐ ๊ฑฐ์ฌ๋ฌ ์ฃผ๋ ๊ฒ
#include <iostream>
#include <vector>
using namespace std;
vector<int> v = {500, 100, 50, 10, 5, 1};
int solution(int n) {
int cnt = 0;
int remaining = 1000 - n;
for (int i = 0; i < v.size() && remaining > 0; i++) {
cnt += remaining / v[i];
remaining %= v[i];
}
return cnt;
}
int main() {
int n;
cin >> n;
cout << solution(n);
return 0;
}
[์ค์ 1] ํฐ ์์ ๋ฒ์น
โ๏ธ ๋ฌธ์
'ํฐ ์์ ๋ฒ์น'์ ์ผ๋ฐ์ ์ผ๋ก ํต๊ณ ๋ถ์ผ์์ ๋ค๋ฃจ์ด์ง๋ ๋ด์ฉ์ด์ง๋ง ๋๋น์ด๋ ๋ณธ์ธ๋ง์ ๋ฐฉ์์ผ๋ก ๋ค๋ฅด๊ฒ ์ฌ์ฉํ๊ณ ์๋ค. ๋๋น์ด์ ํฐ ์์ ๋ฒ์น์ ๋ค์ํ ์๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ด ์์ ๋ ์ฃผ์ด์ง ์๋ค์ M๋ฒ ๋ํ์ฌ ๊ฐ์ฅ ํฐ ์๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ด๋ค. ๋จ, ๋ฐฐ์ด์ ํน์ ํ ์ธ๋ฑ์ค(๋ฒํธ)์ ํด๋นํ๋ ์๊ฐ ์ฐ์ํด์ K๋ฒ์ ์ด๊ณผํ์ฌ ๋ํด์ง ์ ์๋ ๊ฒ์ด ์ด ๋ฒ์น์ ํน์ง์ด๋ค.
์๋ฅผ ๋ค์ด ์์๋๋ก 2, 4, 5, 4, 6์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ด ์์ ๋, M์ด 8์ด๊ณ K๊ฐ 3์ด๋ผ๊ณ ๊ฐ์ ํ์.
์ด ๊ฒฝ์ฐ ํน์ ํ ์ธ๋ฑ์ค์ ์๊ฐ ์ฐ์ํด์ ์ธ ๋ฒ๊น์ง๋ง ๋ํด์ง ์ ์์ผ๋ฏ๋ก ํฐ ์์ ๋ฒ์น์ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๋ 6 + 6 + 6 + 5 + 6 + 6 + 6 + 5์ธ 46์ด ๋๋ค. ๋จ, ์๋ก ๋ค๋ฅธ ์ธ๋ฑ์ค์ ํด๋นํ๋ ์๊ฐ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์๋ก ๋ค๋ฅธ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค.
์๋ฅผ ๋ค์ด ์์๋๋ก 3, 4, 3, 4, 3์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ด ์์ ๋ M์ด 7์ด๊ณ K๊ฐ 2๋ผ๊ณ ๊ฐ์ ํ์. ์ด ๊ฒฝ์ฐ ๋ ๋ฒ์งธ ์์์ ํด๋นํ๋ 4์ ๋ค ๋ฒ์งธ ์์์ ํด๋นํ๋ 4๋ฅผ ๋ฒ๊ฐ์ ๋ ๋ฒ์ฉ ๋ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก 4 + 4 + 4 + 4 + 4 + 4 + 4 ์ธ 28์ด ๋์ถ๋๋ค.
๋ฐฐ์ด์ ํฌ๊ธฐ N, ์ซ์๊ฐ ๋ํด์ง๋ ํ์ M, ๊ทธ๋ฆฌ๊ณ K๊ฐ ์ฃผ์ด์ง ๋ ๋๋น์ด์ ํฐ ์์ ๋ฒ์น์ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ์์ค.
โ๏ธ ์ ๋ ฅ
- ์ฒซ์งธ ์ค์ N(2 <= N <= 1000), M(1 <= M <= 10000), K(1 <= K <= 10000)์ ์์ฐ์๊ฐ ์ฃผ์ด์ง๋ฉฐ ๊ฐ ์์ฐ์๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ๋ค.
- ๋์งธ ์ค์ N๊ฐ์ ์์ฐ์๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ์์ฐ์๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ๋ค. ๋จ, ๊ฐ๊ฐ์ ์์ฐ์๋ 1 ์ด์ 10000 ์ดํ์ ์๋ก ์ฃผ์ด์ง๋ค.
- ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ K๋ ํญ์ M๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
โ๏ธ ์ถ๋ ฅ
- ์ฒซ์งธ ์ค์ ๋๋น์ด์ ํฐ์์ ๋ฒ์น์ ๋ฐ๋ผ ๋ํด์ง ๋ต์ ์ถ๋ ฅํ๋ค.
์ ๊ทผ ๋ฐฉํฅ ๐ ์ ๋ ฌ + Cnt์ K ๋น๊ต
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> v;
int solution(int n, int m, int k) { //M๋ฒ ๋ํ๊ธฐ, K๋ฒ ์ด๊ณผํด ๋ํด์ง ์ ์์
int result = 0, cnt = 0;
sort(v.begin(), v.end(), greater<>());
for (int i = 0; i < m; i++) {
if (cnt >= k) {
result += v[1];
cnt = 0;
} else {
result += v[0];
cnt++;
}
}
return result;
}
int main() {
int n, m, k;
cin >> n >> m >> k;
v.resize(n);
for (int i = 0; i < n; i++) {
cin >> v[i];
}
cout << solution(n, m, k);
return 0;
}
๐ ๊ฐ๋จํ๊ฒ ํธ๋ ๋ฐฉ๋ฒ
๋ฐ๋ณต๋๋ ์์ด์ ๋ํด์ ํ์
ํ๊ธฐ
์ฒซ ๋ฒ์งธ ์์์ 6 + 6 + 6 + 5 ๊ฐ ๋ฐ๋ณต๋๋ค. ๋ฐ๋ณต๋๋ ์์ด์ ๊ธธ์ด๋? K+1์ธ 4์ธ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ M์ (K+1)๋ก ๋๋ ๋ชซ์ด ์์ด์ด ๋ฐ๋ณต๋๋ ํ์๊ฐ ๋๋ค.
BUT! M์ด (K+1)๋ก ๋๋์ด ๋จ์ด์ง์ง ์๋ ๊ฒฝ์ฐ๋ ๊ณ ๋ ค์ ํํจ => ๋๋จธ์ง !
int(M/(K+1))*K + M%(K+1)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> v;
int solution(int n, int m, int k) { //M๋ฒ ๋ํ๊ธฐ, K๋ฒ ์ด๊ณผํด ๋ํด์ง ์ ์์
int result = 0;
sort(v.begin(), v.end(), greater<>());
//๊ฐ์ฅ ํฐ ์๊ฐ ๋ํด์ง๋ ํ์ ๊ณ์ฐํ๊ธฐ
int cnt = (m / (k + 1)) * k;
cnt += m % (k + 1);
result += cnt * v[0];
result += (m - cnt) * v[1];
return result;
}
int main() {
int n, m, k;
cin >> n >> m >> k;
v.resize(n);
for (int i = 0; i < n; i++) {
cin >> v[i];
}
cout << solution(n, m, k);
return 0;
}
[์ค์ 2] ์ซ์ ์นด๋ ๊ฒ์
โ๏ธ ๋ฌธ์
์ซ์ ์นด๋ ๊ฒ์์ ์ฌ๋ฌ ๊ฐ์ ์ซ์ ์นด๋ ์ค์์ ๊ฐ์ฅ ๋์ ์ซ์๊ฐ ์ฐ์ธ ์นด๋ ํ ์ฅ์ ๋ฝ๋ ๊ฒ์์ด๋ค. ๋จ, ๊ฒ์์ ๋ฃฐ์ ์งํค๋ฉฐ ์นด๋๋ฅผ ๋ฝ์์ผ ํ๊ณ ๋ฃฐ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ซ์๊ฐ ์ฐ์ธ ์นด๋๋ค์ด N x M ํํ๋ก ๋์ฌ ์๋ค. ์ด๋ N์ ํ์ ๊ฐ์๋ฅผ ์๋ฏธํ๋ฉฐ, M์ ์ด์ ๊ฐ์๋ฅผ ์๋ฏธํ๋ค.
- ๋จผ์ ๋ฝ๊ณ ์ ํ๋ ์นด๋๊ฐ ํฌํจ๋์ด ์๋ ํ์ ์ ํํ๋ค.
- ๊ทธ๋ค์ ์ ํ๋ ํ์ ํฌํจ๋ ์นด๋๋ค ์ค ๊ฐ์ฅ ์ซ์๊ฐ ๋ฎ์ ์นด๋๋ฅผ ๋ฝ์์ผ ํ๋ค.
- ๋ฐ๋ผ์ ์ฒ์์ ์นด๋๋ฅผ ๊ณจ๋ผ๋ผ ํ์ ์ ํํ ๋, ์ดํ์ ํด๋น ํ์์ ๊ฐ์ฅ ์ซ์๊ฐ ๋ฎ์ ์นด๋๋ฅผ ๋ฝ์ ๊ฒ์ ๊ณ ๋ คํ์ฌ ์ต์ข ์ ์ผ๋ก ๊ฐ์ฅ ๋์ ์ซ์์ ์นด๋๋ฅผ ๋ฝ์ ์ ์๋๋ก ์ ๋ต์ ์ธ์์ผ ํ๋ค.
์นด๋๋ค์ด N x M ํํ๋ก ๋์ฌ ์์ ๋, ๊ฒ์์ ๋ฃฐ์ ๋ง๊ฒ ์นด๋๋ฅผ ๋ฝ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋์์ค.
โ๏ธ ์ ๋ ฅ
- ์ฒซ์งธ ์ค์ ์ซ์ ์นด๋๋ค์ด ๋์ธ ํ์ ๊ฐ์ N๊ณผ ์ด์ ๊ฐ์ M์ด ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ํ์ฌ ๊ฐ๊ฐ ์์ฐ์๋ก ์ฃผ์ด์ง๋ค. (1 <= N, M <= 100)
- ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๊ฑธ์ณ ๊ฐ ์นด๋์ ์ ํ ์ซ์๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ์ซ์๋ 1 ์ด์ 10,000 ์ดํ์ ์์ฐ์์ด๋ค.
โ๏ธ ์ถ๋ ฅ
- ์ฒซ์งธ ์ค์ ๊ฒ์์ ๋ฃฐ์ ๋ง๊ฒ ์ ํํ ์นด๋์ ์ ํ ์ซ์๋ฅผ ์ถ๋ ฅํ๋ค.
์ ๊ทผ ๋ฐฉํฅ ๐ ์ ๋ ฌ ํ ํ์์ ์ต์๊ฐ์ด ์ ์ผ ํฐ ์ ์ฐพ๊ธฐ
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<vector<int>> v;
int main() {
int n, m, result = 0;
cin >> n >> m;
v.resize(n);
for (int i = 0; i < n; i++) {
v[i].resize(m);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> v[i][j];
}
sort(v[i].begin(), v[i].end());
}
for (int i = 0; i < n; i++) {
if (result < v[i][0]) {
result = v[i][0];
}
}
cout << result;
return 0;
}
[์ค์ 3] 1์ด ๋ ๋๊น์ง
โ๏ธ ๋ฌธ์
์ด๋ ํ ์ N์ด 1์ด ๋ ๋ ๊น์ง ๋ค์์ ๋ ๊ณผ์ ์ค ํ๋๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ ํํด ์ํํ๋ ค ํจ
๋จ, ๋๋ฒ์งธ ์ฐ์ฐ์ N์ด K๋ก ๋๋์ด ๋จ์ด์ง ๋๋ง ์ ํํ ์ ์์
- N์์ 1์ ๋บ๋ค.
- N์ K๋ก ๋๋๋ค.
N์ด 1์ด ๋ ๋ ๊น์ง 1๋ฒ ํน์ 2๋ฒ์ ๊ณผ์ ์ ์ํํด์ผํ๋ ์ต์ ํ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑ
โ๏ธ ์ ๋ ฅ
- ์ฒซ์งธ ์ค์ N(2<= N <= 100000)๊ณผ K(2 <= K <= 100000)๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋๋ฉฐ ๊ฐ๊ฐ ์์ฐ์๋ก ์ฃผ์ด์ง
- ์ด๋, ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ N์ ํญ์ K๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์
โ๏ธ ์ถ๋ ฅ
- ์ฒซ์งธ ์ค์ N์ด 1์ด ๋ ๋๊น์ง 1๋ฒ ํน์ 2๋ฒ์ ๊ณผ์ ์ ์ํํด์ผ ํ๋ ํ์์ ์ต์๊ฐ์ ์ถ๋ ฅ
์ ๊ทผ ๋ฐฉํฅ ๐ 1 ์๋๋ฉด k๋๋๋๊ฐ 1๋นผ๊ธฐ
#include <iostream>
using namespace std;
int main() {
int n, k, cnt = 0;
cin >> n >> k;
while (n != 1) {
if (n % k == 0) {
n /= k;
} else {
n -= 1;
}
cnt++;
}
cout << cnt;
return 0;
}
๐ N์ด 100์ต ์ด์ ํฐ ์๊ฐ ๋๋ ๊ฒฝ์ฐ, ๋น ๋ฅด๊ฒ ๋์ํ๋ ค๋ฉด
N์ด K์ ๋ฐฐ์๊ฐ ๋๋๋ก ํจ์จ์ ์ผ๋ก ํ๋ฒ์ ๋นผ๋ ๋ฐฉ์
#include <iostream>
using namespace std;
int main() {
int n, k, result = 0;
cin >> n >> k;
while (true) {
//N์ด K๋ก ๋๋์ด ๋จ์ด์ง๋ ์๊ฐ ๋ ๋๊น์ง๋ง 1์ฉ ๋นผ๊ธฐ
int target = (n / k) * k; //n์ด k๋ก ๋๋์ด ๋จ์ด์ง์ง ์์ ๋ ๊ฐ์ฅ ๊ฐ๊น์ด k๋ก ๋๋์ด ๋จ์ด์ง๋ ์ ์ฐพ๊ธฐ
result += n - target; //1์ ๋นผ์ผํ๋ cnt ๋ํ๊ธฐ
n = target;
//cout << "n: " << n << ", result: " << result << endl;
// N์ด K๋ณด๋ค ์์ ๋ (๋ ์ด์ ๋๋ ์ ์์ ๋) ๋ฐ๋ณต๋ฌธ ํ์ถ
if (n < k)
break;
result += 1; //๋๋ ๋
n /= k;
}
//๋ง์ง๋ง์ผ๋ก ๋จ์ ์์ ๋ํ์ฌ 1 ๋นผ๊ธฐ
result += n - 1;
cout << result;
return 0;
}
'โ๏ธAlgorithm > ๐ ์ด์ทจ์ฝ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ด์ทจ์ฝ] 10. ๊ทธ๋ํ ์ด๋ก - C++ (0) | 2022.10.22 |
---|---|
[์ด์ทจ์ฝ] 9. ์ต๋จ๊ฒฝ๋ก - C++ (0) | 2022.10.22 |
[์ด์ทจ์ฝ] 8. DP - C++ (0) | 2022.10.21 |
[์ด์ทจ์ฝ] 5. DFS/BFS - C++ (0) | 2022.10.20 |
[์ด์ทจ์ฝ] 2. ๊ตฌํ - C++ (0) | 2022.10.04 |