[백준] 문제 10866번 : 덱 - JAVA
2024. 11. 27. 14:35 - DoosanBaek
[링크] https://www.acmicpc.net/problem/10866
💎 문제 분석 & 제약 조건
문제 분석 :
덱(Deque)을 사용하여 여러 가지 명령을 처리하는 프로그램
명령에 따라 덱의 앞과 뒤에서 값을 추가하거나 제거하고, 크기와 상태를 출력
제약 조건 :
1 ≤ N ≤ 100,000: 명령의 개수는 최대 100,000개까지 주어진다.
-10^9 ≤ X ≤ 10^9: 값 X는 매우 큰 정수일 수 있다.
덱의 크기나 명령어의 실행 횟수가 매우 크므로 시간 복잡도에 대한 고려가 필요
🚀 의사 결정
의사결정 :
push_front, push_back: 각각 덱의 앞과 뒤에 원소를 추가하는 연산.
pop_front, pop_back: 덱의 앞과 뒤에서 원소를 제거하는 연산. 비어 있으면 -1 출력.
size: 덱의 크기 출력.
empty: 덱이 비었으면 1, 아니면 0을 출력.
front, back: 덱의 앞과 뒤의 원소를 확인. 비어 있으면 -1 출력.
전체 흐름 :
입력 받기: BufferedReader를 사용해 N을 입력받고, 각 명령을 처리
명령 처리: switch문을 사용하여 각 명령에 대해 덱을 조작
결과 출력: 각 명령의 결과를 StringBuilder에 누적시킨 후 한 번에 출력
📜 소스코드(Java)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
// 입력을 빠르게 받기 위해 BufferedReader 사용
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 첫 번째 입력: 명령의 개수 N
int N = Integer.parseInt(br.readLine());
// 출력 결과를 한 번에 저장할 StringBuilder 객체
StringBuilder sb = new StringBuilder();
// 덱(Deque) 선언 (양쪽 끝에서 원소를 추가하거나 제거할 수 있는 자료구조)
Deque<Integer> deq = new ArrayDeque<Integer>();
// N개의 명령을 처리하는 반복문
for (int i = 0; i < N; i++) {
// 명령을 공백으로 구분하여 토큰화
StringTokenizer st = new StringTokenizer(br.readLine());
// 첫 번째 토큰은 명령어
String S = st.nextToken();
// 명령어에 따라 적절한 동작 수행
switch (S) {
case "push_front" :
// 덱의 앞에 값 추가
deq.addFirst(Integer.parseInt(st.nextToken()));
break;
case "push_back" :
// 덱의 뒤에 값 추가
deq.addLast(Integer.parseInt(st.nextToken()));
break;
case "pop_front" :
// 덱이 비었으면 -1 출력, 아니면 덱 앞에서 값 제거 후 출력
if (deq.isEmpty()) sb.append(-1).append("\n");
else sb.append(deq.pollFirst()).append("\n");
break;
case "pop_back" :
// 덱이 비었으면 -1 출력, 아니면 덱 뒤에서 값 제거 후 출력
if (deq.isEmpty()) sb.append(-1).append("\n");
else sb.append(deq.pollLast()).append("\n");
break;
case "size" :
// 덱의 크기를 출력
sb.append(deq.size()).append("\n");
break;
case "empty" :
// 덱이 비었으면 1, 아니면 0 출력
if (deq.isEmpty()) sb.append(1).append("\n");
else sb.append(0).append("\n");
break;
case "front" :
// 덱이 비었으면 -1 출력, 아니면 덱 앞의 값을 출력
if (deq.isEmpty()) sb.append(-1).append("\n");
else sb.append(deq.peekFirst()).append("\n");
break;
case "back" :
// 덱이 비었으면 -1 출력, 아니면 덱 뒤의 값을 출력
if (deq.isEmpty()) sb.append(-1).append("\n");
else sb.append(deq.peekLast()).append("\n");
break;
}
}
// 모든 명령 처리 후, 한 번에 결과 출력
System.out.println(sb);
}
}
'알고리즘' 카테고리의 다른 글
[백준] 문제 22252번 : 정보 상인 호석 - JAVA (0) | 2024.11.28 |
---|---|
[백준] 문제 2504번 : 괄호의 값 - JAVA (0) | 2024.11.27 |
[백준] 문제 4949번 : 균형잡힌 세상 - JAVA (0) | 2024.11.27 |
[백준] 문제 3986 번 : 좋은 단어 - JAVA (0) | 2024.11.27 |
[백준] 문제 27497번 - 알파벳 블록 - JAVA (0) | 2024.11.27 |
[백준] 문제 16120번 : PPAP - JAVA (0) | 2024.11.26 |
[백준] 문제 17218번 : 비밀번호 만들기 - JAVA (0) | 2024.11.26 |
[백준] 2800번 : 괄호 제거 - JAVA (0) | 2024.11.26 |