PS
BOJ 20921 : 그렇고 그런 사이
lickelon
2024. 2. 4. 23:18
- 문제 링크 : boj.kr/20921
- 난이도 : S1
- 태그 : 해 구성하기, 그리디
20921번: 그렇고 그런 사이
정수 $N$, $K$가 주어진다. ($2 \leq N \leq 4\,242$, $0 \leq K \leq \frac{N(N-1)}{2}$)
www.acmicpc.net
코드
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define INF 0x7FFFFFFF
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n, k;
cin >> n >> k;
vector<int> arr;
for(int i = n-1; i > 0; i--) {
if(k >= i) {
arr.emplace_back(n-1-i);
k -= i;
}
}
int num = 1;
int idx = 0;
for(int i = 0; i < n; i++) {
if(arr.size() > idx && i == arr[idx]) {
cout << n - idx << " ";
idx++;
}
else {
cout << num << " ";
num++;
}
}
return 0;
}
풀이
i번 사람과 그 오른쪽에 있는 모든 사람이 그렇고 그런 사이일 떄, i번 사람의 오른쪽에 있는 사람끼리 쪽지를 서로 바꾸더라도 i번 사람과 그렇고 그런 사이는 유지된다.
i번 사람에게 그 오른쪽에 있는 모든 사람의 정수보다 큰 정수의 쪽지를 준다면 n-i-1개의 그렇고 그런 사이가 생겨난다.
1번부터 시작하여, i번 사람에 대해 남은 필요한 그렇고 그런 사이의 수와 i번 사람과 그 오른쪽의 사람의 수를 비교하여 i번 사람에게 오른쪽의 모든 사람들보다 큰 정수를 줄지 결정한다.
그렇게 결정된 사람들에게 왼쪽부터 가장 큰 수를 순서대로 주고 그렇지 않은 사람들에게는 왼쪽부터 가장 작은 수를 순서대로 준다.
728x90