https://www.acmicpc.net/problem/10845
10845번: 큐
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지
www.acmicpc.net
문제
문제 풀이
- 백준 10828번 스택과 매우 유사한 구현 문제이다.
- 큐(queue)와 스택(stack)의 차이를 알고 있다면 구현에 어려움은 없을 것이다.
큐와 스택의 차이는 큐는 FIFO(First In, First Out), 스택은 LIFO(Last In, First Out), 즉 선입선출, 후입선출의 차이가 있다는 걸 알아야한다.
LIFO : 스택의 후입 선출은 들어온게, 제일 먼저 나간다. 즉 맨 위에 얹어지는 값만 알고 있으면 모두 구현이 가능하다.
FIFO : 큐의 선입 선출은 맨 먼저 들어온게 제일 먼저 나가고, 제일 늦게 들어온게 제일 늦게 나가는, 즉 줄서기와 같이 순서가 정해져있는 자료구조이다. 그렇다면 맨 먼저 들어온 자료의 정보와 제일 늦게 들어온 자료의 정보를 모두 알아야 구현이 가능할 것이다. - 푼 방법
1. 배열로 구현하도록 한다.
2. 입력 조건 중 1 부터 10000까지라는 조건이 있으므로 배열의 크기는 10001으로 설정하였다.
3. push와 pop을 할 때, 동작을 한 이후 push의 경우 back와 size를, pop의 경우 front와 size를 더해주는 것을 잊지말자.
4. back() 명령의 경우 주의해야한다. back은 현재 가장 뒤에 있는 자료를 가르키는 것이 아닌, 가장 뒤에 있는 자료의 그 다음 인덱스를 가르킨다. 따라서 back() 명령을 통해 가장 뒤에 있는 자료를 출력하려면 queue[back - 1]을 출력해야한다.
JAVA code
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class baekjoon10845 {
public static int[] queue = new int[10001];
public static int size = 0;
public static int front = 0;
public static int back = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
String S = st.nextToken();
int ret;
switch (S) {
case "push":
push(Integer.parseInt(st.nextToken()));
break;
case "pop":
ret = pop();
System.out.println(ret);
break;
case "size":
ret = size();
System.out.println(ret);
break;
case "empty":
ret = empty();
System.out.println(ret);
break;
case "front":
ret = front();
System.out.println(ret);
break;
case "back":
ret = back();
System.out.println(ret);
break;
}
}
}
public static void push(int item) {
queue[back] = item;
back++;
size++;
}
public static int pop() {
if (size == 0)
return -1;
else {
int ret = queue[front];
front++;
size--;
return ret;
}
}
public static int size() {
return size;
}
public static int empty() {
if (size == 0)
return 1;
else
return 0;
}
public static int front() {
if (size == 0)
return -1;
else
return queue[front];
}
public static int back() {
if (size == 0)
return -1;
else
return queue[back - 1];
}
}
'백준 문제풀이' 카테고리의 다른 글
[백준] 1158번 요세푸스 문제 [JAVA] (0) | 2022.09.14 |
---|---|
[백준] JAVA로 백준 입력 받는 방법 (0) | 2022.09.14 |
[백준] 9012번 괄호 [JAVA] (2) | 2022.09.13 |
[백준] 10828번 스택 [JAVA] (0) | 2022.09.13 |
[백준] 10773번 제로 [JAVA] (0) | 2022.09.11 |