문제 링크
주의사항
- JAVA를 사용하여 프로그램을 사용하였습니다.
- 백준에서 코드를 작성하였을 때 아래 형태에서 Main에서 결과가 출력되어야 합니다.
public class Main{
public static void main(String[] args){
}
}
문제 설명
접근 방법
기본적으로 큐는 FIFO(선입선출)의 자료구조를 가지고 있습니다.
FIFO는 먼저 들어간 데이터들이 출력할 때 먼저 나온다는 이야기입니다.
예를 들어 3, 2, 1을 순서대로 큐에 저장한 뒤 하나씩 꺼내보겠습니다.
1. 3을 큐에 넣었을 때
3 |
2. 2을 큐에 넣었을 때
3 | 2 |
3. 1을 큐에 넣었을 때
3 | 2 | 1 |
4. 큐에 하나의 자료를 출력하라는 명령이 떨어졌을 때
3 | 2 | 1 |
5. 다시 자료를 출력하라는 명령이 떨어졌을 때
2 | 1 |
위에 표를 보면 가장 먼저 저장된 데이터가 먼저 출력되는 것을 볼 수 있듯이 큐는 FIFO형태의 자료구조입니다.
Java에서 큐를 표현하려면 LinkList<>()로 선언해주어야 하므로 큐를 선언해주었습니다.
문제에서는 push, pop, size, empty, front, back을 구현하도록 했기 때문에 각각의 기능을 함수로 구현하였습니다.
push : Queue.offer이나 Queue.add 를 사용하여 구현하였습니다.
pop : Queue.poll을 사용하여 구현하였습니다.
size : Queue.size을 사용하여 구현하였습니다.
empty : Queue.isEmpty을 사용하여 구현하였습니다.
front : Queue.peek을 사용하여 구현하였습니다.
back : 따로 명령어가 존재하지 않기 때문에 push을 진행할때마다 변수에 저장하여 변수에 내용을 사용하여 구현하였습니다.
- BufferedReader를 사용하여 입력 값을 받았습니다.
- StringTokenizer를 통해서 명령어와 값을 띄어쓰기 기준으로 나누었습니다.
- if문을 통해서 명령어에 해당하는 함수를 실행하도록 하였습니다.
- push/pop/size/empty/front/back 함수를 만들었습니다.
- StringBuilder에 저장된 결과값을 System.out.println을 사용하여 출력하였습니다.
- push/pop/size/empty/front/back 함수들은 모두 위에서 설명한 내용 그대로 구현하였습니다.
결과 코드
import java.io.*;
import java.util.*;
public class Main{
static int size,last = 0; //명령개수, 마지막 저장 값
static Queue<Integer> queue = new LinkedList<Integer>(); //사용할 큐
static StringBuilder sb = new StringBuilder(); //결과
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//BufferedReader를 통해 입력 값 받기
//--------입력값 저장 및 함수 실행------
size = Integer.parseInt(br.readLine());
StringTokenizer st;
for(int i=0;i<size;i++) {
st = new StringTokenizer(br.readLine()," ");
String text = st.nextToken();
if(text.equals("push")) {
int temp = Integer.parseInt(st.nextToken());
push(temp);
}
else if(text.equals("pop"))
pop();
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 함수
public static void push(int n) {
queue.offer(n);
last = n;
}
//pop 함수
public static void pop() {
if(queue.isEmpty())
sb.append("-1\n");
else {
int temp = queue.poll();
sb.append(temp + "\n");
}
}
//size 함수
public static void size() {
sb.append(queue.size() + "\n");
}
//empty 함수
public static void empty() {
if(queue.isEmpty()) {
sb.append("1\n");
}
else {
sb.append("0\n");
}
}
//front 함수
public static void front() {
if(queue.isEmpty())
sb.append("-1\n");
else
sb.append(queue.peek() + "\n");
}
//back 함수
public static void back() {
if(queue.isEmpty())
sb.append("-1\n");
else
sb.append(last + "\n");
}
}
'백준' 카테고리의 다른 글
[백준] 단계별로 풀어보기(단계:19,큐/덱,JAVA)11866번, 요세푸스 문제 0 (0) | 2022.02.14 |
---|---|
[백준] 단계별로 풀어보기(단계:19,큐/덱,JAVA)2164번, 카드 2 (0) | 2022.02.14 |
[백준] 단계별로 풀어보기(단계:18,스택,JAVA)17298번, 오큰수 (0) | 2022.02.13 |
[백준] 단계별로 풀어보기(단계:18,스택,JAVA)1874번, 스택 수열 (0) | 2022.02.13 |
[백준] 단계별로 풀어보기(단계:18,스택,JAVA)4949번, 균형잡힌 세상 (0) | 2022.02.13 |
댓글