
01. ๐ ๋ฌธ์ ํ์
N: ๊ธฐ์กด์ ์ค์น๋ ํด๊ฒ์ ๊ฐ์ (0 <= N <= 50)
M: ์ค์นํด์ผ ํ ํด๊ฒ์ ๊ฐ์ (1 <= M <= 100)
L: ๊ณ ์๋๋ก์ ๊ธธ์ด (100 <= 1000)
(N+M < L)
* ๊ธธ์ด L๋งํผ์ ๊ณ ์๋๋ก์ M๊ฐ์ ํด๊ฒ์๋ฅผ ๊ฐ์ฅ ๊ธด ๊ธธ์ด๊ฐ ์ต์๊ฐ ๋๋๋ก ์ค์นํ์ฌ, ๊ทธ ๊ธธ์ด๋ฅผ ์ถ๋ ฅ
์๋ก ์ค์นํ๋ ํด๊ฒ์๋ ๊ธฐ์กด์ ํด๊ฒ์์ ์์น์ ๊ณ ์๋๋ก์ ์ ๋๋จ์๋ ์ค์นํ ์ ์์
01-1. ๊ฐ๋ฅํ ์๊ฐ ๋ณต์ก๋
- ์๊ฐ์ ํ 2์ด๋ก ์๊ฐ ๋ณต์ก๋ O(L*N logL*N) ์ดํ๋ก ๊ตฌํ ๊ฐ๋ฅ
01-2. ์๊ณ ๋ฆฌ์ฆ ์ ํ
- ์ด ๋ฌธ์ ๋ ์ต๋ ๊ตฌ๊ฐ์ ์ต์ ๊ธธ์ด๋ฅผ ํ์ํ๋ ๋ฌธ์ ๋ก L๊ณผ N์ ๊ฐ์ ์ง๋ฐฐ
๋ฐ๋ผ์, ๋ธ๋ฃจํธํฌ์ค์ ๊ฒฝ์ฐ, ์๊ฐ ๋ณต์ก๋ O(L*N) ์ผ๋ก ๊ตฌํ ๊ฐ๋ฅ - ์ด์ง ํ์์ ์ด์ฉํ์ฌ ๊ตฌํํ ์, ์๊ฐ ๋ณต์ก๋O(N log L) ์ ๊ฐ์ง
02. ๐ ์ฝ๋ ์ค๊ณํ๊ธฐ
[๊ณตํต]
- N, M, L ์ ๋ํด ์ ๋ ฅ
- ์ค์น๋ ํด๊ฒ์์ ์์น N๊ฐ ์ ๋ ฅ
- ๊ฐ ๊ตฌ๊ฐ ๋ณ ํ์์ ์ํด ์ ๋ ฌ
[2-1. ๋ธ๋ฃจํธํฌ์ค]
4. ๊ธธ์ด 1๋ถํฐ L-1๊น์ง ๋ฐ๋ณตํ๋ฉฐ ๊ฐ๋ฅํ ์ต๋ ๊ตฌ๊ฐ์ ์ต์ ๊ธธ์ด๋ฅผ ํ์
4-1. ๊ฐ ๊ตฌ๊ฐ์ ๋ํด, ์๊ตฌ ๊ธธ์ด๋ฅผ ๋๋์ด ์ค์น ๊ฐ๋ฅํ ํด๊ฒ์ ๊ฐ์๋ฅผ ํฉํจ
4-2. ์ค์น ๊ฐ๋ฅํ ํด๊ฒ์์ ์ดํฉ์ด M๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฒฝ์ฐ, ์ต๋ ๊ตฌ๊ฐ์ ์ต์ ๊ธธ์ด๋ก ์ถ๋ ฅ
[2-2. ์ด์ง ํ์]
4. ์ด์ง ํ์์ ์ํ (์ ๋์ ์ ์ ์ธํ์ฌ) ์์ ์ 1, ๋ ์ L-1์ ์ค์
5. ์๊ตฌ ๊ธธ์ด์ ๊ธฐ์ค์ด ๋๋ ์ค๊ฐ ๊ฐ์ ๊ณ์ฐ
6. ๊ฐ ๊ตฌ๊ฐ์ ๋ํด ์ค๊ฐ ๊ฐ์ ๋๋์ด ์ค์น ๊ฐ๋ฅํ ํด๊ฒ์์ ๊ฐ์๋ฅผ ํฉํจ
7. ์ค์น ๊ฐ๋ฅํ ํด๊ฒ์์ ๊ฐ์๊ฐ M๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฒฝ์ฐ, ๋ ์งง์ ๊ธธ์ด๊ฐ ์กด์ฌํ ์ ์์ผ๋ฏ๋ก, ๋ ์ ์ mid - 1๋ก ๋น๊น
8. ์ค์น ๊ฐ๋ฅํ ํด๊ฒ์์ ๊ฐ์๊ฐ M๋ณด๋ค ํด ๊ฒฝ์ฐ, ์๊ตฌ๋ M์ ์ด๊ณผํ๋ฏ๋ก, ์์ ์ ์ m + 1๋ก ์ค์ ํด ์๊ตฌ ๊ธธ์ด๋ฅผ ๋๋ฆผ
9. 5-8์ ๊ณผ์ ์ ์์ ์ ๊ณผ ๋ ์ ์ด ๋ง๋ ๋๊น์ง ๋ฐ๋ณต
10. ํ์ฌ ์์ ์ ์ ์์น๋ฅผ ์ถ๋ ฅ
03. ๐ ๏ธ ์๋๋ณ ์์
1ํ์ฐจ
04. ๐๏ธ ์ ๋ต ์ฝ๋
[4-1. ๋ธ๋ฃจํธํฌ์ค]
#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
vector<int> v;
int N, M, L;
cin >> N >> M >> L;
v.push_back(0);
v.push_back(L);
for(int i = 0; i < N; i++){
int tmp;
cin >> tmp;
v.push_back(tmp);
}
sort(v.begin(), v.end());
for(int i = 1; i < L; i++){
int needed = 0;
for(int j = 0; j < v.size()-1; j++){
int cur_len = v[j+1] - v[j];
needed += ((cur_len - 1) / i);
}
if(needed <= M){
cout << i << "\n";
break;
}
}
return 0;
}
[4-2. ์ด์งํ์]
#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
vector<int> v;
int N, M, L;
cin >> N >> M >> L;
v.push_back(0);
v.push_back(L);
for(int i = 0; i < N; i++){
int tmp;
cin >> tmp;
v.push_back(tmp);
}
sort(v.begin(), v.end());
int start = 1, end = L - 1;
while(start <= end){
int mid = (start + end) / 2;
int needed = 0;
for(int i = 0; i < v.size()-1; i++){
int cur_len = v[i+1] - v[i];
needed += ((cur_len - 1) / mid);
}
if(needed <= M) end = mid - 1;
else start = mid + 1;
}
cout << start << "\n";
return 0;
}'Problem Solving > Baekjoon Online Judge (BOJ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [C++] BOJ 12015 - ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 2 (0) | 2025.04.13 |
|---|---|
| [C++] BOJ 2473 - ์ธ ์ฉ์ก (0) | 2025.04.12 |
| [C++] BOJ 1806 - ๋ถ๋ถํฉ (0) | 2025.04.10 |
| [C++] BOJ 8895 - ๋ง๋ ๋ฐฐ์น (0) | 2025.04.10 |
| [C++] BOJ 1562 - ๊ณ๋จ ์ (0) | 2025.04.09 |
์๋ชป๋ ์ ๋ณด๊ฐ ์๋ค๋ฉด ๋ง์ํด์ฃผ์ธ์!