거짓 카드
면접 대비시간 제한2초메모리 제한512 MB
각 카드가 아래에 있는 거짓 카드 수가 a_i 이상이라고 주장할 때, 거짓 카드가 정확히 K장이 되도록 N장을 배치한다. 문제에서 정한 순서로 출력하고 불가능하면 -1을 출력한다.
문제
카드 장으로 이루어진 덱이 있다. 번째 카드에는 "이 카드보다 아래에 있는 카드 중 거짓인 카드가 장 이상이다"라는 주장이 적혀 있다.
카드를 한 줄로 쌓으면 각 카드의 주장이 실제 상황과 맞는지 따질 수 있다. 주장이 맞는 카드는 참이고, 맞지 않는 카드는 거짓이다. 한 카드가 참인지 거짓인지는 그 카드보다 아래에 놓인 거짓 카드의 개수로만 정해진다.
거짓인 카드가 정확히 장이 되도록 장을 모두 쌓는 순서를 구하라. 그런 순서가 아예 없을 수도 있다.
입력
첫째 줄에 정수 과 가 주어진다. (, )
다음 개 줄에 정수 가 한 줄에 하나씩 주어진다. ()
출력
조건을 만족하는 순서가 여럿일 수 있으므로 답은 다음 규칙으로 하나만 정한다.
카드에 적힌 수 개를 오름차순으로 정렬한다. 작은 쪽 개를 그 오름차순 그대로 덱의 위쪽에 놓고, 남은 개를 내림차순으로 그 아래에 이어 놓는다. 이렇게 만든 덱의 거짓 카드가 정확히 장이면 덱의 맨 위 카드부터 맨 아래 카드까지 개의 수를 공백으로 구분해 한 줄에 출력한다. 그렇지 않으면 -1을 출력한다.
거짓 카드가 정확히 장인 순서가 하나라도 있으면 이 덱이 반드시 그런 순서 중 하나다.
힌트
참과 거짓은 덱의 아래쪽부터 따지면 된다. 위에서 아래로 0, 1, 3, 3, 2를 놓은 덱을 보자.
맨 아래 카드는 2인데 그 아래에는 거짓 카드가 0장이므로 주장이 맞지 않아 거짓이다. 그 위 카드는 3이고 아래에 거짓 카드가 1장뿐이므로 거짓이다. 그 위 카드는 3이고 아래에 거짓 카드가 2장이므로 거짓이다. 그 위 카드는 1이고 아래에 거짓 카드가 3장이므로 참이다. 맨 위 카드는 0이므로 참이다. 이 덱의 거짓 카드는 모두 3장이다.