문제
교재 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
public class P11268_절댓값힙 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
PriorityQueue<Integer> MyQueue = new PriorityQueue<>((o1, o2) -> {
int first_abs = Math.abs(o1);
int second_abs = Math.abs(o2);
if (first_abs == second_abs)
return o1 > o2 ? 1 : -1;// 절대값이 같은 경우 음수 우선 정렬
else
return first_abs - second_abs;// 절대값을 기준으로 정렬
});
for (int i = 0; i < N; i++) {
int request = Integer.parseInt(br.readLine());
if (request == 0) {
if (MyQueue.isEmpty())
System.out.println("0");
else
System.out.println(MyQueue.poll());
} else {
MyQueue.add(request);
}
}
}
}
설명
딱히 이해 어려운 부분 없음.
그냥 우선순위 큐 어떻게 쓰고, Comparator 어떻게 쓰는지 정도 훑고 복습하면 된다고 생각함
내 풀이) 24.6.6에 풀고 맞았음
import java.util.*;
import java.io.*;
public class Main
{
public static void main(String[] args) throws IOException {
// 배열에 정수 x (x ≠ 0)를 넣는다.
// 배열에서 절댓값이 가장 작은 값을 출력하고, 그 값을 배열에서 제거한다.
// 절댓값이 가장 작은 값이 여러개일 때는, 가장 작은 수를 출력하고, 그 값을 배열에서 제거한다.
//
// 첫째 줄에 연산의 개수 N(1≤N≤100,000)
// . 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x
// x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고,
// x가 0이라면 배열에서 절댓값이 가장 작은 값을 출력하고 그 값을 배열에서 제거하는 경우이다.
// 입력되는 정수는 -231보다 크고, 231보다 작다.
// 입력에서 0이 주어진 회수만큼 답을 출력한다.
// 만약 배열이 비어 있는 경우인데 절댓값이 가장 작은 값을 출력하라고 한 경우에는 0을 출력하면 된다.
//
// 접근법
// 큐일까? 우선순위 큐가 떠오르네
// 절댓값 씌우는 건 math.abs 같은 거? 쓰면 될 것이고
// comparator를 이용해서 두 객체를 비교하며 절댓값 작은 게 front에 오도록 해야 겠지
// 슈도코드
// n을 입력받음
// n번 반복해서 다음을 실행함
// 우선순위 큐를 선언함
// 정수 x를 입력받음
// x가 0이 아니라면
// que.add
// x가 0이라면
// 출력(que.poll)
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
PriorityQueue<Integer> que=new PriorityQueue<>((o1,o2)->{
int first=Math.abs(o1);
int second=Math.abs(o2);
// 절댓값 같으면
if(first==second){
return o1>o2? 1:-1;
}else{
return first-second;
}
});
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
for(int i=0;i<n;i++){
int x=sc.nextInt();
if(x==0){
if(que.size()==0){
bw.append("0\n");
}else{
bw.append(que.poll()+"\n");
}
} else{
que.add(x);
}
}
bw.flush();
bw.close();
}
}
처음 시도할 때 틀린 이유
###문제 코드###
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
for(int i=0;i<n;i++){
int x=sc.nextInt();
if(x==0){
if(que.size()<1){
bw.append('0\n');
}else{
bw.append(que.poll()+'\n');
}
} else{
que.add(x);
}
}
###에러 내용###
Main.java:54: error: unclosed character literal
bw.append('0\n');
^
Main.java:54: error: illegal character: '\'
bw.append('0\n');
^
Main.java:54: error: unclosed character literal
bw.append('0\n');
^
Main.java:54: error: not a statement
bw.append('0\n');
문제 코드에서 발생한 오류는 다음과 같습니다:
- '0\n'는 단일 문자(char)가 아닌 문자열(string)입니다. 따라서 단일 문자에는 작은 따옴표(')를 사용하고, 문자열에는 큰 따옴표(")를 사용해야 합니다.
- \n은 개행 문자(새로운 줄)를 나타내는 이스케이프 시퀀스입니다. 이것은 문자열 안에서만 의미를 갖습니다. 하지만 '0\n'은 단일 문자(char)로 해석되기 때문에 오류가 발생합니다.
'CODING TEST > BOJ' 카테고리의 다른 글
[java] 문제 016 (백준 1377) (0) | 2024.06.06 |
---|---|
[java] 문제 015 (백준 2750) (0) | 2024.06.06 |
[java] 문제 013 (백준 2164) (0) | 2024.06.06 |
[java] 문제 012 (백준 17298) (0) | 2024.06.04 |
[java] 문제 011(백준 1874) (0) | 2024.06.03 |