미소를뿌리는감자의 코딩

[백준 2024/01/17] 18258번 큐 2 본문

코딩 테스트/백준

[백준 2024/01/17] 18258번 큐 2

미뿌감 2024. 1. 17. 18:49
728x90

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

 

18258번: 큐 2

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 2,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

 

1. 접근 방법

이 문제를 보자마자 double ended queue가 Java에 구현되어 있다면 얼마나 좋을까.. 라고 생각하였다!

바로~ chatGPT에게 구현 여부를 물어보았고, 구현되어 있음을 알 수 있었다. (야호~)

 

따라서 전체적인 구조는 10828번 구조를 다시 가지고 왔으며, 

import java.util.Deque;
import java.util.ArrayDeque;

 

import를 해주었다.

 

a == b vs Objects.equals(a,b)

Objects.equals(inp[0], "push")

두 식의 차이점은 무엇일까?

코드를 작성하다보니, 전자로는 되지 않던 것이 후자로 적용하니 되곤 하였다.

 

1) Object.equals()

이 경우, 클래스에 있는 정석 '메서드'이다. 따라서, 두 객체를 안전하게 비교할 수 있으며,

null 도 handle 해준다는 장점이 있다.

따라서 두 객체가 같은 참조를 가지고 있지 않더라도, 논리적으로 동등하다면 true를 반환한다.

 

즉, 주소 값이 다르더라도, true를 반환한다는 뜻이다.

 list의 경우 pointer로 구성되어 있음을 기억할 것이다.

C 언어의 경우에도, list의 경우 function으로 넘겨줄 때, pointer처리를 하지 않고 그대로 넘겨주어도 문제가 없다.

그 이유는 list가 주소값으로 지정되어 있기 때문이다.

 

아마도 이와 같이, list의 경우 주소 값으로 형성이 되어 있기 때문에, == 으로 비교를 하게 된다면

주소 값 또한 영향을 받는 것이 아닌가 생각한다.

 

2) ==

== 연산자는 메모리 상에서 같은 위치에 있는지 확인하는 연산자이다. 

즉, 주소 값을 비교한다는 뜻이다.

Java에서 문자열의 경우 == 는 같은 객체인지 확인할 뿐, 문자열의 '내용'이 같은지는 확인하지 않는다.

 

따라서, 자바에서 문자열의 내용을 비교할 때에는 equals 메서드를 사용하는 것이 일반적 이다.

2. 코드

import java.util.Objects;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Deque;
import java.util.ArrayDeque;

public class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter pw = new PrintWriter(System.out);
        Deque<Integer> deque = new ArrayDeque<>();

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

        for (int i=0; i<number;i++){
            String line = br.readLine();
            String[] inp = line.split("\\s+");

            if(Objects.equals(inp[0], "push")){
                deque.addLast(Integer.parseInt(inp[1]));
            }
            else if(Objects.equals(inp[0], "pop")){
                pw.println(deque.isEmpty()? -1: deque.removeFirst());
            }
            else if(Objects.equals(inp[0], "size")){
                pw.println(deque.size());
            }
            else if(Objects.equals(inp[0], "empty")){
                pw.println(deque.isEmpty()? 1: 0);
            }
            else if(Objects.equals(inp[0], "front")){
                pw.println(deque.isEmpty()? -1: deque.peekFirst());
            }
            else{
                pw.println(deque.isEmpty()? -1: deque.peekLast());
            }

        }
        pw.flush();
        br.close();
        pw.close();

    }

}
728x90