문제 링크
주의사항
- JAVA를 사용하여 프로그램을 사용하였습니다.
- 백준에서 코드를 작성하였을 때 아래 형태에서 Main에서 결과가 출력되어야 합니다.
public class Main{
public static void main(String[] args){
}
}
문제 설명
접근 방법
기본적으로 덱은 큐(FIFO), 스택(LIFO)처럼 나오는 순서가 한 곳으로 한정된 것이 아닌 양방향에서 출력할 수 있는 자료구조입니다. 그래서 스택으로 사용할 수도 있고 큐로 사용할 수 있는 자료구조입니다.
예를 들어 3, 2, 1을 순서대로 덱에 저장한 뒤 하나씩 꺼내보겠습니다.
1. 3을 덱에 넣었을 때
3 |
2. 2을 덱에 넣었을 때
3 | 2 |
3. 1을 덱에 넣었을 때
3 | 2 | 1 |
4. 덱에서는 자료를 출력할 때 First인지 Last인지 정할 수 있습니다.
First인 경우
3 | 2 | 1 |
Last인 경우
3 | 2 | 1 |
5. 결과
First인 경우
2 | 1 |
Last인 경우
3 | 2 |
위에 표를 보면서 덱은 First와 Last를 구분하여 저장 및 출력할 수 있습니다.
Java에서 덱를 표현하려면 ArrayDeque<>()로 선언해주어야 하므로 덱을 선언해주었습니다.
문제에서는 push_front, push_back, pop_front, pop_back, size, empty, front, back을 구현하도록 되어있습니다.
push_front : Deque.addFirst를 사용하여 구현하였습니다.
push_back : Deque.addLast를 사용하여 구현하였습니다.
pop_front : Deque.pollFirst을 사용하여 구현하였습니다.
pop_back : Deque.pollLast을 사용하여 구현하였습니다.
size : Deque.size을 사용하여 구현하였습니다.
empty : Deque.isEmpty을 사용하여 구현하였습니다.
front : Deque.peekFirst을 사용하여 구현하였습니다.
back : Deque.peekLast을 사용하여 구현하였습니다.
- BufferedReader를 사용하여 입력 값을 받았습니다.
- StringTokenizer를 통해서 명령어와 값을 띄어쓰기 기준으로 나누었습니다.
- if문을 통해서 명령어에 해당하는 함수를 실행하도록 하였습니다.
- push_front/push_bakc/pop_front/pop_back/size/empty/front/back 함수를 만들었습니다.
- StringBuilder에 저장된 결과값을 System.out.println을 사용하여 출력하였습니다.
- push/pop/size/empty/front/back 함수들은 모두 위에서 설명한 내용 그대로 구현하였습니다.
결과 코드
import java.io.*;
import java.util.*;
public class Main{
static Deque<Integer> deque = new ArrayDeque<>(); //문제에 사용할 덱
static StringBuilder sb = new StringBuilder(); //결과 저장할 StringBuilder
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//입력 값을 받는 BufferedReader
//--------입력값 저장 및 if문을 통한 함수 실행-------
int index = Integer.parseInt(br.readLine());
StringTokenizer st;
for(int i=0;i<index;i++) {
st = new StringTokenizer(br.readLine()," ");
String text = st.nextToken();
if(text.equals("push_front")) {
int n = Integer.parseInt(st.nextToken());
push_front(n);
}else if(text.equals("push_back")) {
int n = Integer.parseInt(st.nextToken());
push_back(n);
}else if(text.equals("pop_front"))
pop_front();
else if(text.equals("pop_back"))
pop_back();
else if(text.equals("size"))
size();
else if(text.equals("empty"))
empty();
else if(text.equals("front"))
front();
else if(text.equals("back"))
back();
}
System.out.println(sb.toString()); //결과 출력
br.close();
}
//------push_front 함수----------
public static void push_front(int n) {
deque.addFirst(n);
}
//------push_back 함수----------
public static void push_back(int n) {
deque.addLast(n);
}
//------pop_front 함수----------
public static void pop_front() {
if(deque.isEmpty()) {
sb.append("-1\n");
return;
}
sb.append(deque.pollFirst() + "\n");
}
//------pop_back 함수----------
public static void pop_back() {
if(deque.isEmpty()) {
sb.append("-1\n");
return;
}
sb.append(deque.pollLast() + "\n");
}
//------size 함수----------
public static void size() {
sb.append(deque.size() + "\n");
}
//------empty 함수----------
public static void empty() {
if(deque.isEmpty())
sb.append("1\n");
else
sb.append("0\n");
}
//------front 함수----------
public static void front() {
if(deque.isEmpty()) {
sb.append("-1\n");
return;
}
sb.append(deque.peekFirst() + "\n");
}
//------back 함수----------
public static void back() {
if(deque.isEmpty()) {
sb.append("-1\n");
return;
}
sb.append(deque.peekLast() + "\n");
}
}
'백준' 카테고리의 다른 글
[백준] 단계별로 풀어보기(단계:19,큐/덱,JAVA)5430번, AC (0) | 2022.02.16 |
---|---|
[백준] 단계별로 풀어보기(단계:19,큐/덱,JAVA)1021번, 회전하는 큐 (0) | 2022.02.16 |
[백준] 단계별로 풀어보기(단계:19,큐/덱,JAVA)1966번, 프린터 큐 (0) | 2022.02.15 |
[백준] 단계별로 풀어보기(단계:19,큐/덱,JAVA)11866번, 요세푸스 문제 0 (0) | 2022.02.14 |
[백준] 단계별로 풀어보기(단계:19,큐/덱,JAVA)2164번, 카드 2 (0) | 2022.02.14 |
댓글