본문 바로가기
공부/2024 항해99코딩클럽

99클럽 3기 코테 스터디 9일차 TIL /[백준] 1927 최소 힙 자바 풀이

by 푸딩코딩 2024. 7. 30.
728x90
반응형

 

 

 

 

 

 

1. 오늘의 학습 문제 


문제


 

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

 

 

 

최소 힙 성공

 
 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 (추가 시간 없음) (하단 참고) 128 MB 88808 42359 33522 49.056%

문제

널리 잘 알려진 자료구조 중 최소 힙이 있다. 최소 힙을 이용하여 다음과 같은 연산을 지원하는 프로그램을 작성하시오.

  1. 배열에 자연수 x를 넣는다.
  2. 배열에서 가장 작은 값을 출력하고, 그 값을 배열에서 제거한다.

프로그램은 처음에 비어있는 배열에서 시작하게 된다.

입력

첫째 줄에 연산의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0이라면 배열에서 가장 작은 값을 출력하고 그 값을 배열에서 제거하는 경우이다. x는 231보다 작은 자연수 또는 0이고, 음의 정수는 입력으로 주어지지 않는다.

출력

입력에서 0이 주어진 횟수만큼 답을 출력한다. 만약 배열이 비어 있는 경우인데 가장 작은 값을 출력하라고 한 경우에는 0을 출력하면 된다.

예제 입력 1 복사

9
0
12345678
1
2
0
0
0
0
32

예제 출력 1 복사

0
1
2
12345678
0

 

 

 

 

자바에서는 우선순위큐로 힙 자료구조를 제공한다.

PriorityQueue<> 로 선언한다. 기본은 최소힙(가장 작은 것이 루트노드), 

PriorityQueue<> .. = new PriorityQueue<>(Collections.reverseOrder()); //최대힙선언하는 법

 

 

 

코드


import java.util.*;
import java.io.*;



public class Main {
    public static void main(String[] args ) throws IOException{

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        PriorityQueue<Integer> minHeap = new PriorityQueue<>(); //최소힙 선언

        int n= Integer.parseInt(br.readLine());

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

            if(x==0){
                if (minHeap.isEmpty())
                    bw.write("0\n");
                else
                    bw.write(minHeap.poll() + "\n");
            }
            else{
                minHeap.add(x);
            }

        }

        bw.flush(); //버퍼에 있는 모든 데이터를 출력 스트림으로 전송
        bw.close(); //스트림 닫고 리소스 해제 
        br.close();

    }
}

 

시간초과를 막기위해 buffer를 쓴 것은 좋았지만, 

50%대에서 시간초과가 났다. 

이유를 찾아보니 출력시에도 버퍼를 써야한다고 한다. 원래 코드는 System.out.println() 꼴이었다. 

따라서 BufferWriter를 선언하여 버퍼에 데이터를 저장했다가 flush()하여 한번에 출력 스트림으로 전송했다. 

마지막으로 버퍼를 닫아준다. 

 

 

-버퍼와 스캐너의 차이?

스캐너 Scanner : 1kb(1024byte) 메모리, 데이터가 들어오면 입력을 바로 (내부에서 정규 표현식 적용, 입력값 분할, 파싱 과정 거쳐)전달한다.

버퍼 BufferReader : 8kb(8192byte) 메모리, 데이터가 들어오면 버퍼 영역에 저장했다가, 한번에 전달한다.

 

 

-> 둘의 차이는 메모리의 크기와 속도이다. 

 

버퍼의 속도>>>>스캐너의 속도.

 

 

 

 

 

->그렇다면 스캐너의 이점이 있을까

 

1. 다양한 데이터 타입(int, double, string)을 쉽게 읽을 수 있는 메서드 제공

2. 정규 표현식 지원

3. 자동 공백처리

4. 예외처리

5. 스트림 지원

 

사용자 입장에서 스캐너는 사용하기 편리하다. 하지만 대량의 데이터 처리 및 성능이 중요한 상황에서는 버퍼가 더 적합하다. 상황에 맞게 선택하자

 

 

 

2. 오늘의 회고


 

  • 버퍼와 스캐너의 차이를 배웠다. 
  • 최소힙을 복습했다. 

#99클럽 #코딩테스트 준비 #개발자 취업 #항해99 #TIL

 

 

728x90
반응형