https://www.acmicpc.net/problem/10845
- 문제
- 문제 풀이
백준 10845번 큐는 실버 4 난이도의 자료 구조 및 큐 문제이다. 이 문제는 간단히 문제에 나와있는 명령어 6개를 구현하면 된다. 만약 큐에 대해 공부하고 싶으면 밑에 있는 링크를 참고하면 되겠다.
https://propercoding.tistory.com/18
우선 이 문제에 나와있는 6개의 명령어를 각각 메서드로 만들 것이다. 이 이유는 각각의 명령어를 메서드로 만들면 구독성이 더 뛰어나기 때문이다. 그리고 메인 함수에서 입력을 받고 각각의 함수를 실행하는 식으로 구현할 것이다.
그리고 이 문제에서 쓸 큐와 StringBuilder는 메인 메서드가 아니라 클래스에 static 변수로 선언할 것이다. 이 이유는 메인 함수에서만 큐와 StringBuilder를 쓰는 게 아니라 다른 메서드들에서도 사용할 것이기 때문에 클래스 변수로 선언해 줄 것이다.
이제 각각의 명령어를 구현해 보겠다.
1. push X
push X는 정수 X를 큐에 넣는 연산이다. 간단히 push 메서드에 매개 변수로 int X를 받는 걸로 하고 큐에 추가해주기만 하면 된다.
2. pop
pop은 큐가 비어있으면 -1을 출력하고, 아니면 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력하는 연산이다. 즉, pop 메서드를 만들고 큐가 비어있는지 아닌지는 q.isEmpty() 함수로 확인한다. 비어있으면 -1을 출력하고, 아니면 q.remove()한 값을 출력하면 된다.
3. size
size는 큐에 들어있는 정수의 개수를 출력한다. 이 함수는 간단하다. q.size()를 출력해주면 된다.
4. empty
empty는 큐가 비어있는지 아닌지만 확인해주면 되는 함수이다. 큐가 비어있으면 1, 아니면 0을 출력하면 된다.
5. front
front는 큐가 비어있으면 -1을 출력하고, 아니면 큐의 가장 앞에 있는 정수를 출력하면 된다. 마찬가지로 q.isEmpty()로 큐가 비어있는지 아닌지를 확인하고 q.peek()한 값을 출력하면 된다.
6. back
back은 큐가 비어있으면 -1을 출력하고 아니면 큐의 가장 뒤에 있는 정수를 출력하면 된다. 이 함수도 마찬가지로 q.isEmprt()를 써서 큐가 비었는지 아닌지를 확인하면 된다. 하지만, 큐에는 마지막에 있는 값을 확인하는 메서드가 없다. 따라서 이 함수는 직접 구현을 해줘야 한다.
이 함수는 큐의 특성인 선입선출을 이용해서 구현하면 된다. 큐는 먼저 추가한 값이 먼저 제거된다. 따라서 큐에 n개의 숫자가 있으면 n - 1개의 숫자들을 제거하고 바로 다시 넣어준 다음에 첫 번째 숫자를 q.peek()을 이용해서 출력해주면 된다.
자세한 코드는 밑에 있는 코드를 참고해주면 되겠다.
- 코드
import java.io.*;
import java.util.*;
public class Main {
static Queue<Integer> q;
static StringBuilder sb;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
q = new LinkedList<>();
StringTokenizer st;
sb = new StringBuilder();
String s;
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
s = st.nextToken();
if (s.equals("push")) push(Integer.parseInt(st.nextToken()));
if (s.equals("pop")) pop();
if (s.equals("size")) size();
if (s.equals("empty")) empty();
if (s.equals("front")) front();
if (s.equals("back")) back();
}
System.out.print(sb);
}
//큐에 x 삽입
static void push(int x) {
q.add(x);
}
//큐 첫번째 숫자 빼내기
static void pop() {
if (q.isEmpty()) {
sb.append("-1\n");
} else {
sb.append(q.remove() + "\n");
}
}
//큐 사이즈 출력
static void size() {
sb.append(q.size() + "\n");
}
//큐가 비어있으면 1, 비어있지 않으면 0 출력
static void empty() {
if (q.isEmpty()) {
sb.append("1\n");
} else {
sb.append("0\n");
}
}
//큐가 비어있으면 -1 출력. 비어있지 않으면 첫번째 숫자 출력
static void front() {
if (q.isEmpty()) {
sb.append("-1\n");
} else {
sb.append(q.peek() + "\n");
}
}
//큐가 비어있으면 -1 출력. 비어있지 않으면 마지막 숫자 출력
static void back() {
if (q.isEmpty()) {
sb.append("-1\n");
return;
}
int n = q.size();
for (int i = 1; i <= n - 1; i++) {
q.add(q.remove());
}
sb.append(q.peek() + "\n");
q.add(q.remove());
}
}
'백준' 카테고리의 다른 글
[백준] 11653번 : 소인수분해 – JAVA [자바] (0) | 2022.07.31 |
---|---|
[백준] 10757번 : 큰 수 A+B – JAVA [자바] (0) | 2022.07.31 |
[백준] 2752번 : 세수정렬 – JAVA [자바] (0) | 2022.07.26 |
[백준] 1427번 : 소트인사이드 – JAVA [자바] (0) | 2022.07.25 |
[백준] 10989번 : 수 정렬하기 3 – JAVA [자바] (0) | 2022.07.24 |
댓글