[백준] 10866번 덱 JAVA (자바) 풀이
문제 10866번
: 아래와 같은 [명령] 덱으로 구현해보기
[명령]
push_front X | 정수 X를 덱 앞에 넣는 연산 |
push_back X | 정수 X를 덱 뒤에 넣는 연산 |
pop_front | 덱에서 가장 앞에 있는 정수를 빼고 그 수를 출력, 큐에 정수가 없는 경우에 -1을 출력 |
pop_back | 덱에서 가장 뒤에 있는 정수를 빼고 그 수를 출력, 큐에 정수가 없는 경우에 -1을 출력 |
size | 덱에 들어있는 정수의 개수 출력 |
empty | 덱이 비어있으면 1, 아니면 0 출력 |
front | 덱의 가장 앞에 있는 정수를 출력. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력 |
back | 덱의 가장 뒤에 있는 정수를 출력. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력 |
[입력]
: 첫째 줄에 주어지는 명령의 수 N
: 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다
[출력]
: 명령 출력할 때마다 한 줄에 하나씩 출력
[덱]
: 덱은 들어가는 문, 나가는 문 각각 2개씩 (입구와 출구를 양쪽에 모두 만든 자료구조)
: Queue(큐)는 선입선출, 데이터 입구와 출구가 반대편에 있고 단방향 자료구조이다 (에스컬레이터)
: 역방향으로 참조하거나 반대로 넣어야 할 경우 Deque(덱)사용
[덱 연산]
init() | 덱 초기화 |
create() | 덱 생성 |
isEmpty() | 덱 비어있는지 검사 |
isFull() | 덱 가득 찼는지 검사 |
getFirst() | 덱 맨 앞의 값 출력 (덱 비어 있는 경우 에러 발생) |
getLast() | 덱 맨 뒤의 값 출력 (덱 비어 있는 경우 에러 발생) |
peekFirst() / peek | 덱 맨 앞의 값 출력 (덱 비어있는 경우 null 반환) |
peekLast() | 덱 맨 뒤의 값 출력 (덱 비어있는 경우 null 반환) |
element() | 덱 맨 앞의 값 출력 (덱 비어 있는 경우 에러 발생) |
offerFirst(e) | 덱의 맨 앞에 e 추가 (덱 비어있는 경우 null 반환) |
offerLast(e) / offer | 덱의 맨 뒤에 e 추가 (덱 비어있는 경우 null 반환) |
addFirst(e) | 덱의 맨 앞에 e 추가(덱 비어 있는 경우 에러 발생) |
addLast(e) | 덱의 맨 뒤에 e 추가(덱 비어 있는 경우 에러 발생) |
pollFirst() / poll | 덱의 맨 앞의 값 제거하고 출력 (덱 비어있는 경우 null 반환) |
pollLast() | 덱의 맨 뒤의 값 제거하고 출력 (덱 비어있는 경우 null 반환) |
removeFirst() | 덱의 맨 앞의 값 제거하고 출력 (덱 비어 있는 경우 에러 발생) |
removeLast() | 덱의 맨 뒤의 값 제거하고 출력 ( 비어 있는 경우 에러 발생) |
* : 코드 구현에 사용된 것
*
offer / offerLast → {deque} → poll / pollFirst | ||
pollLast ← {deque} ← offerFirst |
[코드]
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[] args)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
Deque<Integer> q = new LinkedList<>();
int N =Integer.parseInt(br.readLine());
while(N -->0){
StringTokenizer st = new StringTokenizer(br.readLine()," ");
switch(st.nextToken()){
case"push_front" :
q.offerFirst(Integer.parseInt(st.nextToken()));
break;
case"push_back" :
q.offerLast(Integer.parseInt(st.nextToken()));
break;
case "pop_front" :
if(q.isEmpty())
bw.write(-1+"\n");
else
bw.write(q.pollFirst()+"\n");
break;
case "pop_back" :
if(q.isEmpty())
bw.write(-1+"\n");
else
bw.write(q.pollLast()+"\n");
break;
case "size" :
bw.write(q.size()+"\n");
break;
case "empty" :
if(q.isEmpty())
bw.write(1+"\n");
else
bw.write(0+"\n");
break;
case "front" :
if(q.isEmpty())
bw.write(-1+"\n");
else
bw.write(q.peek()+"\n");
break;
case "back" :
if(q.isEmpty())
bw.write(-1+"\n");
else
bw.write(q.peekLast()+"\n");
break;
}
}
bw.flush();
}
}
[해설]
: Deque<Integer> q = new LinkedList<>(); 덱선언
: int N =Integer.parseInt(br.readLine()); 첫쨰줄에 명령어 개수 입력받기
: StringTokenizer st = new StringTokenizer(br.readLine()," "); 문자열을 " "을 기준으로 구분
: switch(st.nextToken()){
case"push_front" : 헷갈릴 것 없이 front면 first, back이면 Last 따라가면 돼
q.offerFirst(Integer.parseInt(st.nextToken()));
break;
case"push_back" :
q.offerLast(Integer.parseInt(st.nextToken()));
break;
case "pop_front" :
if(q.isEmpty())
bw.write(-1+"\n");
else
bw.write(q.pollFirst()+"\n");
break;
case "pop_back" :
if(q.isEmpty())
bw.write(-1+"\n");
else
bw.write(q.pollLast()+"\n");
break;
이제 풀어보러 갈께요 :)

https://www.acmicpc.net/problem/10866
10866번: 덱
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지
www.acmicpc.net
* 독학으로 익히는 코딩이라 틀린 것이 있을 수 있습니다. 오류가 있다면 댓글을 통해 알려주세요. 감사합니다. *