2021. 12. 11. 15:05ㆍ알고리즘/그리디
문제
화학 실험을 하던 윤이는 일렬로 나열해 놓은 $N$개의 시험관에서 재밌는 특징을 발견했다. 그 특징은 모든 이웃한 시험관 쌍에 대해, 두 시험관에 들어 있는 시약의 색깔이 서로 다르다는 점이었다. 흥미롭다고 느낀 윤이는 실험보고서에 이 사실과 함께 각 색깔별 시약의 수를 적었다. 하지만 보고서를 채점하던 조교 원이는 윤이가 색깔별 시약의 수를 제대로 적었는지 의문이 들었다. 윤이의 보고서와 일치하도록 시험관을 배열할 수 있는지 판별하는 프로그램을 작성하시오.
입력
첫 번째 줄에 시험관의 개수 $N$과 색깔의 종류 수 $K$가 공백을 사이에 두고 주어진다.
두 번째 줄에 $K$개의 양의 정수 $c_i$가 공백을 사이에 두고 주어진다. 각 색깔에는 번호가 붙어 있으며, $c_i$는 $i$번 색깔의 시약이 담긴 시험관의 개수이다. $(1≤i≤K)$
출력
조건을 만족하는 시험관 배열을 만들 수 있으면, 시험관의 색깔 번호를 공백으로 구분하여 순서대로 출력한다. 답이 여러 개이면 아무 거나 출력한다.
조건을 만족하는 시험관 배열을 만들 수 없으면 $-1$을 출력한다.
제한
$1 ≤ K ≤ N ≤ 300,000$
$c_1, \cdots, c_k > 0$
$c_1+\cdots+c_k = N$
서브태스크 1 (40점)
$i≥2$에 대해 $c_i=1$
서브태스크 2 (60점)
추가적인 제약 조건이 없다.
예제 입력 1
6 3 3 1 2
예제 출력 1
1 2 3 1 3 1
이 입력은 서브태스크 1의 조건을 만족하지 않는다.
예제 입력 2
6 3 4 1 1
예제 출력 2
-1
접근 방법
- 0. 각 시험관의 개수를 최대 힙에 저장한 뒤, 이를 하나씩 빼내어주며 배열(result)에 저장한다.
- 1. 이때 값을 하나씩 빼내어 줄 때마다 다른 리스트(temp)에 저장하고, 만일 리스트에 값이 존재하는 경우 해당 값을 빼내어 최대 힙에 다시 저장한다.
- 2. 최대 힙에 값이 없거나, result에 값이 연속되는 경우 동작을 중단한다.
- 3. 만일 result에 있는 값이 연속되는 경우 -1을 출력한다.
- 4. 3번에 해당되지 않는다면 배열의 원소를 출력조건에 맞게 출력한다.
코드
# https://www.acmicpc.net/problem/20311
# 접근 방법
# 0. 각 시험관의 개수를 최대 힙에 저장한 뒤, 이를 하나씩 빼내어주며 배열(result)에 저장한다.
# 1. 이때 값을 하나씩 빼내어 줄 때마다 다른 리스트(temp)에 저장하고, 만일 리스트에 값이 존재하는 경우 해당 값을 빼내어 최대 힙에 다시 저장한다.
# 2. 최대 힙에 값이 없거나, result에 값이 연속되는 경우 동작을 중단한다.
# 3. 만일 result에 있는 값이 연속되는 경우 -1을 출력한다.
# 4. 3번에 해당되지 않는다면 배열의 원소를 출력조건에 맞게 출력한다.
import sys, heapq
input = sys.stdin.readline
n, k = map(int, input().split())
arr = list(map(int, input().split()))
maxH = []
for i in range(k):
heapq.heappush(maxH, [-arr[i], i])
flag = True
result = []
temp = []
while maxH:
value, index = heapq.heappop(maxH)
result.append(index+1)
if len(result) >= 2 and result[-1] == result[-2]:
flag = False
break
if temp:
x = temp.pop()
if x[0] < 0:
heapq.heappush(maxH, x)
temp.append([value + 1, index])
if not flag or temp[0][0] <= -1:
print(-1)
else:
for x in result:
print(x, end = ' ')
'알고리즘 > 그리디' 카테고리의 다른 글
백준 온라인 저지, 그리디 / 11508번: 2+1세일 (파이썬 / , 백준 실버문제) (0) | 2022.02.02 |
---|---|
백준 온라인 저지, 그리디 / 9237번: 이장님초대 (파이썬 / , 백준 실버문제) (0) | 2022.01.02 |
백준 온라인 저지, 그리디 / 14659번: 한조서열정리하고옴ㅋㅋ (파이썬 / , 백준 브론즈문제) (0) | 2021.12.11 |
백준 온라인 저지, 그리디 / 1911번: 흙길보수하기 (파이썬 / , 백준 실버문제) (0) | 2021.12.07 |
백준 온라인 저지, 그리디 / 19941번: 햄버거분배 (파이썬 / , 백준 실버문제) (0) | 2021.12.07 |