백준 1138 한 줄로 서기

gmlwlswldbs·2022년 1월 19일
0

코딩테스트

목록 보기
122/130
import heapq

n = int(input())
line = list(map(int, input().split()))
q = []
for i in range(n):
    heapq.heappush(q, (i+1, line[i]))
ans = []
while q:
    tmp = []
    tmp_ans = []
    while q:
        height, taller = heapq.heappop(q)
        cnt = 0
        for i in ans:
            if i > height:
                cnt += 1
        if cnt == taller:
            heapq.heappush(tmp_ans, (height, taller))
        else:
            heapq.heappush(tmp, (height, taller))
    check = 1
    while tmp_ans:
        height, taller = heapq.heappop(tmp_ans)
        if check == 1:
            ans.append(height)
            check = 0
        else:
            heapq.heappush(tmp, (height, taller))
    q = tmp
print(*ans)

힙을 이용해서 풀었다.
힙에서 하나씩 빼서 만약 키가 더 큰 사람의 수가 같으면 임시 힙에 넣어주고
조건에 해당되는 사람들이 많아서 임시힙에 여러개가 들어가면 키가 가장 작은 것 넣고 나머지는 다시 힙에 넣어서 정렬하였다 (키가 작은 것을 넣은 이유는 다음에 키가 더 큰 사람을 카운트할 때 영향을 주지 않기 때문에) (말이 좀 이해하기 힘들지만)
팝, 푸쉬 연산이 많아서 좀 헷갈려서 무한루프를 많이 돌았다

0개의 댓글