복's

[ 백준 - 11286 ] 절대값 힙 본문

알고리즘/백준

[ 백준 - 11286 ] 절대값 힙

나복이 2023. 11. 5. 00:39
728x90

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

 

11286번: 절댓값 힙

첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0

www.acmicpc.net

힙을 사용하는 문제였는데 힙의 구현을 유도하는 문제였나 싶다.

힙은 사실 아직까지 구현 해본적 없어서 해보긴 해야 하는데....


[ 📌 풀이 ]

정수가 1개씩 주어지는데 1개씩 주어질 때마다 분기 요구사항에 맞춰서 처리하면 된다.

  • 0일 때
    • heap이 비어있다면 0을 출력한다.
    • heap이 비어있지 않다면 요소 하나 출력한다.
  • 0이 아닐 때 힙에 주어진 정수를 넣는다.

다만 정수를 힙에 삽입할 때 절대 값으로 넣어야 한다.

그 외 특별한 조건은 없다.


[ 📌 코드 - Python ]

"""
# Author    : Lee In Bok 
# Date      : 2023.11.05(Sun)
# Spend Time: 34m 23s
# Runtime   : 124 ms
# Memory    : 39824 KB
# Algoritm  : Heap
"""

import sys
from heapq import heappop, heappush
input = sys.stdin.readline

class Solution():
    def sol(self):
        heap = []

        for _ in range(N):
            num = int(input())

            if num != 0:
                heappush(heap, (abs(num), num))
            else:
                if heap:
                    print(heappop(heap)[1])
                else:
                    print(0)
            

s = Solution()
N = int(input())

s.sol()

[ 📌 코드 - Java ]

/**
* Author    : Lee In Bok 
* Date      : 2023.11.05(Sat)
* Spend Time: 34m 23s
* Runtime   : 316 ms
* Memory    : 25280 KB
* Algoritm  : Heap
 */

package BaekJoon.QueueAndDeque.Q11286;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;

public class Q11286_AbsoluteHeap {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        Queue<Pair> queue = new PriorityQueue<>(new Comparator<Pair>() {
            @Override
            public int compare(Pair p1, Pair p2){
                if(p1.abs == p2.abs){
                    return p1.org - p2.org;
                }
                return p1.abs - p2.abs;
            }
        });
        int N = Integer.parseInt(br.readLine());

        for(int i = 0; i < N; i++){
            int num = Integer.parseInt(br.readLine());

            if(num == 0){
                if(!queue.isEmpty()){
                    sb.append(queue.poll().org).append('\n');
                } else {
                    sb.append(0).append('\n');
                }
            } else {
                queue.add(new Pair(Math.abs(num), num));
            }
        }

        System.out.println(sb);
    }
}

class Pair{
    int abs;
    int org;

    Pair(int abs, int org){
        this.abs = abs;
        this.org = org;
    }
}

[ 📌 결과 - Python & Java ] 

[ Result - Python & Java ]

728x90

'알고리즘 > 백준' 카테고리의 다른 글

[ 백준 - 1377 ] 버블 소트  (2) 2023.11.24
[ 백준 - 1676 ] 팩토리얼 0의 개수  (0) 2023.11.15
[ 백준 - 2559 ] 수열  (0) 2023.11.03
[ 백준 - 12891 ] DNA 비밀번호  (2) 2023.10.29
[ 백준 - 1253 ] 좋다 (Python)  (0) 2023.09.25