본문 바로가기
CODING TEST/BOJ

[java] 문제 014 (백준 11286)

by 정성인(人) 2024. 6. 6.

문제

절댓값 힙

 

교재 풀이

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');

문제 코드에서 발생한 오류는 다음과 같습니다:

  1. '0\n'는 단일 문자(char)가 아닌 문자열(string)입니다. 따라서 단일 문자에는 작은 따옴표(')를 사용하고, 문자열에는 큰 따옴표(")를 사용해야 합니다.
  2. \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