미소를뿌리는감자의 코딩
[백준 2024/01/17] 18258번 큐 2 본문
https://www.acmicpc.net/problem/18258
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();
}
}
'코딩 테스트 > 백준' 카테고리의 다른 글
[백준 2024/01/18] 1021번 회전하는 큐 (0) | 2024.01.18 |
---|---|
[백준 2024/01/18] 1874번 스택 수열 (0) | 2024.01.18 |
[백준 2024/01/17] 10773번 제로 (0) | 2024.01.17 |
[백준 2024/01/17] 10828번 스택 (0) | 2024.01.17 |
[백준 2024/01/17] 1002번 터렛 (0) | 2024.01.17 |