💡 문제
💬 입출력 예시
📌 풀이(소스코드)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[] queue = new int[2000001];
static int start = 0, end = -1;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
String cmd = st.nextToken();
if (cmd.equals("push")) {
push(Integer.parseInt(st.nextToken()));
} else if (cmd.equals("pop")) {
sb.append(pop()).append("\n");
} else if (cmd.equals("size")) {
sb.append(size()).append("\n");
} else if (cmd.equals("empty")) {
sb.append(empty()).append("\n");
} else if (cmd.equals("front")) {
sb.append(front()).append("\n");
} else if (cmd.equals("back")) {
sb.append(back()).append("\n");
}
}
System.out.println(sb);
}
private static void push(int x) {
queue[++end] = x;
}
private static int pop() {
if (size() == 0) {
return -1;
}
return queue[start++];
}
private static int size() {
return end - start + 1;
}
private static int empty() {
if (size() == 0) {
return 1;
}
return 0;
}
private static int front() {
if (size() == 0) {
return -1;
}
return queue[start];
}
private static int back() {
if (size() == 0) {
return -1;
}
return queue[end];
}
}
📄 해설
접근
- 라이브러리를 사용해서 풀이하는 것이 목표가 아닌 문제. 정수형 배열로 큐를 구현했다.
- 앞서 풀이했던 스택 문제와는 자료구조에 대한 차이만 있으므로, 역시 큐에 대한 이해도가 있다면 쉽게 해결이 가능할 것이다.
- 문제에서 제시하는 조건에 맞는 명령들을 전부 메소드로 구현했다.
과정
- 사용한 변수들을 살펴보면 스택과 약간의 차이가 존재한다. 스택은 스택의 Top을 가리키는 인덱스 변수 하나만으로 관리가 가능하지만, 큐의 경우는
start
와 end
라는 두개의 변수를 사용하여 관리하고 있는데, 이는 각각 큐의 front
와 rear
를 가리킨다. 각각 0 과 -1 로 초기화하고 사용했다.
- 각 메소드들에 대한 설명만을 작성하도록 하겠다. 솔직히 설명이 필요한 메소드들도 아니라고 생각한다.
push(int x)
: 큐의 end
인덱스를 증가시키고, 그 위치에 x
를 넣는다.
pop()
: start
인덱스의 값을 출력하고, 인덱스를 증가시킨다. 큐는 앞에서 원소가 빠지는 구조이다. 그리고 이를 start
인덱스를 증가시킴으로써 빠져나간것처럼 구현했다. 큐가 비어있으면 -1 을 반환해야하므로 아래에서 설명할 size()
메소드를 재사용했다.
size()
: 맨 마지막 원소의 인덱스 - 맨 처음 원소의 인덱스 + 1 이 되어야 큐의 크기가 나온다.
empty()
: 큐가 비어있는지 아닌지를 확인하기 위해 size()
메소드를 재사용했다. size()
메소드의 반환 값이 0이면 1을 반환하고, 그렇지 않으면 0을 반환한다.
front()
: 현재 큐의 start
인덱스에 있는 값을 반환한다. 역시 size()
메소드를 사용하여 비어있는지 여부를 확인한다.
back()
: 현재 큐의 end
인덱스에 있는 값을 반환한다. 역시 size()
메소드를 사용하여 비어있는지 여부를 확인한다.