덱
0.5 초 (추가 시간 없음) | 256 MB | 96070 | 53514 | 44809 | 56.180% |
문제
정수를 저장하는 덱(Deque)를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 여덟 가지이다.
- push_front X: 정수 X를 덱의 앞에 넣는다.
- push_back X: 정수 X를 덱의 뒤에 넣는다.
- pop_front: 덱의 가장 앞에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
- pop_back: 덱의 가장 뒤에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
- size: 덱에 들어있는 정수의 개수를 출력한다.
- empty: 덱이 비어있으면 1을, 아니면 0을 출력한다.
- front: 덱의 가장 앞에 있는 정수를 출력한다. 만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
- back: 덱의 가장 뒤에 있는 정수를 출력한다. 만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
입력
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.
출력
출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.
예제 입력 1 복사
15
push_back 1
push_front 2
front
back
size
empty
pop_front
pop_back
pop_front
size
empty
pop_back
push_front 3
empty
front
예제 출력 1 복사
2
1
2
0
2
1
-1
0
1
-1
0
3
예제 입력 2 복사
22
front
back
pop_front
pop_back
push_front 1
front
pop_back
push_back 2
back
pop_front
push_front 10
push_front 333
front
back
pop_back
pop_back
push_back 20
push_back 1234
front
back
pop_back
pop_back
예제 출력 2 복사
-1
-1
-1
-1
1
1
2
2
333
10
10
333
20
1234
1234
20
덱..
또 지피티 소환
진심 자료구조 가물가물... 가물치 ㅈㅅ
덱(Double-Ended Queue)은 양쪽 끝에서 삽입과 삭제가 모두 가능한 자료구조입니다. 자바에서는 Deque 인터페이스로 제공되며, 이는 Queue 인터페이스를 확장한 것으로, 양방향 큐의 기능을 지원합니다.
주요 특징
- 양방향 삽입/삭제:
- 덱은 양쪽 끝에서 요소를 삽입하고 삭제할 수 있어, **큐(Queue)**나 **스택(Stack)**처럼 한쪽 끝만 다루는 자료구조에 비해 더 유연하게 사용됩니다.
- addFirst(), addLast(), removeFirst(), removeLast() 등을 통해 양쪽 끝에서 조작할 수 있습니다.
- Deque 인터페이스: 자바에서 덱은 java.util.Deque 인터페이스로 제공됩니다. 주요 구현체로는 ArrayDeque와 LinkedList가 있습니다.
주요 메서드
- addFirst(E e): 덱의 앞부분에 요소 추가
- addLast(E e): 덱의 뒷부분에 요소 추가
- removeFirst(): 덱의 앞부분에서 요소 제거
- removeLast(): 덱의 뒷부분에서 요소 제거
- peekFirst(): 덱의 앞부분에서 요소를 제거하지 않고 확인
- peekLast(): 덱의 뒷부분에서 요소를 제거하지 않고 확인
앗 아까 peekLast가 여기있구만 !!!!!!!!
확실히 양쪽 끝에서 요소 삽입 삭제 가능이면 딴 것보다 훨씬 유연하겠다 그치그치
이제 구현을 해볼까... 했는데......
- push_front X: 정수 X를 덱의 앞에 넣는다.
- push_back X: 정수 X를 덱의 뒤에 넣는다.
망했다
계속 디폴트로 날먹하고 있었는데... 이젠 쟤도 분류해야함
어케 분류해 망할!!!!!!!!!!
생각해보니까 첨부터 String 배열로 분류하면 되는 거였따...
아 default 하지 말 걸 지금 큐 코드 추가하러 갑니다..
스택도 추가해야지
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Deque;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Deque<Integer> deque = new LinkedList<>();
int N = Integer.parseInt(br.readLine());
for (int i = 0; i < N; i++) {
String[] input = br.readLine().split(" ");
switch (input[0]) {
case "push_front":
int num = Integer.parseInt(input[1]);
deque.addFirst(num);
break;
case "push_back":
int num = Integer.parseInt(input[1]);
deque.addLast(num);
break;
case "pop_front":
if (deque.isEmpty()) {
System.out.println(-1);
break;
}
System.out.println(deque.pollFirst());
break;
case "pop_back":
if (deque.isEmpty()) {
System.out.println(-1);
break;
}
System.out.println(deque.pollLast());
break;
case "size":
System.out.println(deque.size());
break;
case "empty":
if (deque.isEmpty()) {
System.out.println(1);
break;
}
System.out.println(0);
break;
case "front":
if (deque.isEmpty()) {
System.out.println(-1);
break;
}
System.out.println(deque.peekFirst());
break;
case "back":
if (deque.isEmpty()) {
System.out.println(-1);
break;
}
System.out.println(deque.peekLast());
break;
}
}
}
}
또잉...
와이러노...
계속 고쳐봐도 안 돼서 결국 지피티한테 물어봄.
딱 하나만 고치면 됩니다! 지금 코드에서 case "push_back" 부분에 num 변수를 다시 선언하고 있어요. 그런데 이 num은 이미 위에서 push_front에서 선언된 지역 변수입니다.
Java에서는 같은 블록 안에서 동일한 이름의 변수를 다시 선언할 수 없습니다.
헉!!!! 스위치 케이스로 분리돼있어서 생각 못했던 문제... 같은 블록이라 다시 선언이 안 되는 거였다.
frontNum backNum 으로 각각 바꿔줬다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Deque;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Deque<Integer> deque = new LinkedList<>();
int N = Integer.parseInt(br.readLine());
for (int i = 0; i < N; i++) {
String[] input = br.readLine().split(" ");
switch (input[0]) {
case "push_front":
int frontNum = Integer.parseInt(input[1]);
deque.addFirst(frontNum);
break;
case "push_back":
int backNum = Integer.parseInt(input[1]);
deque.addLast(backNum);
break;
case "pop_front":
if (deque.isEmpty()) {
System.out.println(-1);
break;
}
System.out.println(deque.pollFirst());
break;
case "pop_back":
if (deque.isEmpty()) {
System.out.println(-1);
break;
}
System.out.println(deque.pollLast());
break;
case "size":
System.out.println(deque.size());
break;
case "empty":
if (deque.isEmpty()) {
System.out.println(1);
break;
}
System.out.println(0);
break;
case "front":
if (deque.isEmpty()) {
System.out.println(-1);
break;
}
System.out.println(deque.peekFirst());
break;
case "back":
if (deque.isEmpty()) {
System.out.println(-1);
break;
}
System.out.println(deque.peekLast());
break;
}
}
}
}
스무스한 통과!!!
아 너무 쉬운 것만 풀었나?? 이따 시간 나면 한 개 더 풀어야겠다,,
결론은 확실히 덱이 사용성이 더 좋다. 근데 자꾸 디큐로 읽게 되는 건... 영알못이라서?🤔
덱...
Deque는 "Double Ended Queue"의 줄임말로,
양쪽 끝에서 삽입과 삭제가 모두 가능한 자료구조이다.
한쪽으로만 입력 가능하도록 설정한 덱을 스크롤(scroll)이라고 하며, 한쪽으로만 출력 가능하도록 설정한 덱을 셸프(shelf)라고 한다.
🔸 덱의 주요 연산
push_front(x) | x를 덱의 앞에 삽입 |
push_back(x) | x를 덱의 뒤에 삽입 |
pop_front() | 덱의 앞에서 요소 제거하고 반환 (없으면 -1) |
pop_back() | 덱의 뒤에서 요소 제거하고 반환 (없으면 -1) |
front() | 덱의 앞 요소 조회 (없으면 -1) |
back() | 덱의 뒤 요소 조회 (없으면 -1) |
size() | 덱에 들어있는 요소 개수 출력 |
empty() | 덱이 비어있으면 1, 아니면 0 출력 |
🔹 Java에서 덱 구현 방법
Java에서는 Deque 인터페이스를 이용해 덱을 만들 수 있다.
LinkedList를 덱처럼 쓰거나 ArrayDeque를 사용한다.
- deque.addFirst(x) → 앞에 삽입
- deque.addLast(x) → 뒤에 삽입
- deque.pollFirst() → 앞에서 꺼내기 (비어있으면 null)
- deque.pollLast() → 뒤에서 꺼내기 (비어있으면 null)
- deque.peekFirst() → 앞 요소 조회
- deque.peekLast() → 뒤 요소 조회
'백준 풀기' 카테고리의 다른 글
백준 17478번: 재귀함수가 뭔가요? with Java (0) | 2025.04.21 |
---|---|
백준 11866번: 요세푸스 문제 0 with Java (0) | 2025.04.20 |
백준 10845번: 큐 with Java (1) | 2025.04.19 |
백준 10828번: 스택 with Java (0) | 2025.04.18 |
백준 17087번: 숨바꼭질 6 with Java (1) | 2025.04.17 |