반응형

   문제

   https://www.acmicpc.net/problem/11286



전체적인 구현은 앞의 우선순위큐와 거의 동일하다.

절대값으로 변환하여 비교해주고 절대값이 같을때 작은경우가 부모노드가 될수있도록 

하면된다.절대값은 직접 구현할수도 있지만 너무 지저분해질거 같아서 abs()함수를 

사용하여 비교하였다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import sys
input=sys.stdin.readline
pq=[]
pqlen=0#길이
 
N=int(input())
while N>0:
    N-=1
    x=int(input())
 
    if x!=0:#push
        pq.append(x) #제일끝에 추가해준다
        pqlen += 1
        a=pqlen-1
        while a>0:#힙구조 만들기
            if abs(pq[a])<abs(pq[(a-1)//2]):  #절대값비교
                pq[a],pq[(a-1)//2]=pq[(a-1)//2],pq[a]
                a=(a-1)//2
            elif abs(pq[a])==abs(pq[(a-1)//2]):#절대값이 같을때는 작은거먼저
                if pq[a]<pq[(a-1)//2]:
                    pq[a], pq[(a - 1// 2= pq[(a - 1// 2], pq[a]
                    a = (a - 1// 2
                else:
                    break
            else:
                break
 
 
    elif x==0:#pop
 
        if pqlen==0:
            print(0)
        else:
            print(pq[0])
            pq[0]=pq[pqlen-1]
            pq.pop()
            pqlen-=1
            a=0 #루트노드부터 출발
            child=1
            while child<=pqlen-1:#힙구조 만들기 길이를 초과하지 않을때까지
                if a*2+2<=pqlen-1 and abs(pq[a*2+1])>=abs(pq[a*2+2]):#작은자식찾기
                    if abs(pq[a*2+1])==abs(pq[a*2+2]):
                        if pq[a*2+1]>pq[a*2+2]:#둘중작은거
                            child = a * 2 + 2
 
                    else:
                        child = a * 2 + 2
 
 
 
                if abs(pq[child])<abs(pq[a]):#자식이 더작다면 스왑
                    pq[child],pq[a]=pq[a],pq[child]
                    a=child
                    child=a*2+1
                elif abs(pq[child])==abs(pq[a]):#절대값이 같을때는 작은거
                    if pq[child]<pq[a]:
                        pq[child], pq[a] = pq[a], pq[child]
                        a = child
                        child = a * 2 + 1
                    else:
                        break
 
                else:#더이상 스왑할 필요없으면 멈춤
                    break
 

cs



반응형

'알고리즘(python) > 자료구조' 카테고리의 다른 글

[Python]트리 백준 11725  (0) 2020.03.15
[Python]우선순위큐 백준 1655  (0) 2020.02.02
[Python]우선순위큐 백준 1927  (0) 2020.02.02
[Python]우선순위큐 백준 11279  (0) 2020.02.01
[Python]Deque 백준 5430  (0) 2020.01.18
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기