1. 오늘의 학습 문제
문제
https://www.acmicpc.net/problem/1927
최소 힙 성공
1 초 (추가 시간 없음) (하단 참고) | 128 MB | 88808 | 42359 | 33522 | 49.056% |
문제
널리 잘 알려진 자료구조 중 최소 힙이 있다. 최소 힙을 이용하여 다음과 같은 연산을 지원하는 프로그램을 작성하시오.
- 배열에 자연수 x를 넣는다.
- 배열에서 가장 작은 값을 출력하고, 그 값을 배열에서 제거한다.
프로그램은 처음에 비어있는 배열에서 시작하게 된다.
입력
첫째 줄에 연산의 개수 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
'공부 > 2024 항해99코딩클럽' 카테고리의 다른 글
99클럽 3기 코테 스터디 11일차 TIL /[프로그래머스] 가장 큰 수 자바 풀이 (0) | 2024.08.01 |
---|---|
99클럽 3기 코테 스터디 10일차 TIL /[백준] 11279번 최대힙 자바 풀이 (0) | 2024.07.31 |
99클럽 3기 코테 스터디 8일차 TIL /[프로그래머스] 두 큐 합 같게 만들기 (0) | 2024.07.29 |
99클럽 3기 코테 스터디 7일차 TIL /[프로그래머스] 과제 진행하기 자바 풀이, 스택 (0) | 2024.07.29 |
99클럽 3기 코테 스터디 6일차 TIL /[프로그래머스] 테이블 해시 함수 자바 풀이 (0) | 2024.07.27 |