문제출처 : https://www.acmicpc.net/problem/20921
code
#include <iostream>
using namespace std;
int arr[4300] = { 0 };
int main()
{
int N, K, temp = 0;
cin >> N >> K;
int start = 1, end = N;
if (K == (N * (N - 1)) / 2)
for (int i = 0; i < N; i++)
{
arr[i] = end;
end--;
}
else if (N > K)
{
arr[0] = start + K;
for (int i = 1; i < N; i++)
{
if (start == arr[0])
start++;
arr[i] = start;
start++;
}
}
else
{
for (int i = 0; i < N; i++)
{
if (K > 0)
{
if (N <= K)
{
arr[i] = end;
end--;
K -= end;
}
else
{
if (K >= N - i - 1)
{
arr[i] = end;
end--;
K -= end;
}
else
{
arr[i] = start + K;
temp = start + K;
K = 0;
}
}
}
else
{
if (start == temp)
start++;
arr[i] = start;
start++;
}
}
}
for (int i = 0; i < N; i++)
{
cout << arr[i];
if (i != N - 1)
cout << " ";
}
return 0;
}
2가지 케이스로 나눠생각하면 쉽게풀릴것이다.
N이 K보다 작은경우,
N이 K보다 큰경우 두가지로 나눠서
K의 개수에 따라 큰숫자부터 앞에 배치하고, 그 뒤로는 오름차순으로 정렬하면 된다.
예를들어,
5 0
1 2 3 4 5
5 1
2 1 3 4 5
5 2
3 1 2 4 5
5 3
4 1 2 3 5
5 4
5 1 2 3 4
5 5
5 2 1 3 4
5 6
5 3 1 2 4
5 7
5 4 1 2 3
5 8
5 4 2 1 3
5 9
5 4 3 1 2
5 10
5 4 3 2 1
여기서 규칙을 찾아 알고리즘을 구현하면 된다.