[백준/BOJ] 20921. 그렇고 그런 사이 [SIlver 2]

jychan99·2021년 12월 11일
0
post-thumbnail
  1. 그렇고 그런 사이

문제출처 : 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

여기서 규칙을 찾아 알고리즘을 구현하면 된다.

profile
내가 지금 두려워 하고 있는 일이 바로 내가 지금 해야 할 일이다. 🐥

0개의 댓글