덱을 사용하면 쉽게 구현가능한 문제.
입력과 동시에 연산을 수행하고 출력한다. 주석 참고!
출력은 StringBuilder를 사용하여 출력하였다.
순서대로 System.out.print와 / StringBuilder 를 사용하여 출력한 결과물이다.
비교하면 약 두배의 속도가 차이난다.
SystemOut은 매번 String을 선언하고 (생성되는 String 주소값) 메모리를 쓰지만
StringBuilder는 하나의 주소값에서 연산을 수행한다.
// 덱
// https://www.acmicpc.net/problem/10866
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class B10866 {
static int N;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
StringTokenizer st;
Deque<Integer> deque = new ArrayDeque<>();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(),"_| ");
String str = st.nextToken();
// 입력이 들어올때
if(Objects.equals(str, "push")){
String sbStr = st.nextToken();
int num = Integer.parseInt(st.nextToken());
if(Objects.equals(sbStr, "front")){
// 덱의 첫번째에 삽입
deque.addFirst(num);
}else{
// 마지막에 삽입
deque.addLast(num);
}
// 그 외에 문자가 들어올 때
}else {
// "_"으로 자른 첫 문자열이 pop일때
// 뒤에 문자와 합쳐준다
if (Objects.equals(str, "pop")) {
String sbStr = st.nextToken();
str += sbStr;
}
// switch case 를 통해 입력과 동시에
switch (str) {
// 바로 위 if 문에서 합친 문자열 popfront
case "popfront": {
if (deque.isEmpty()) {
//System.out.println(-1);
sb.append(-1).append("\n");
continue;
}
sb.append(deque.removeFirst()).append("\n");
break;
}
case "popback": {
if (deque.isEmpty()) {
sb.append(-1).append("\n");
continue;
}
sb.append(deque.removeLast()).append("\n");
break;
}
case "size": {
sb.append(deque.size()).append("\n");
break;
}
case "empty": {
if (deque.isEmpty()) {
sb.append(1).append("\n");
} else {
sb.append(0).append("\n");
}
break;
}
case "front": {
if (deque.isEmpty()) {
sb.append(-1).append("\n");
continue;
}
sb.append(deque.peekFirst()).append("\n");
break;
}
case "back": {
if (deque.isEmpty()) {
sb.append(-1).append("\n");
continue;
}
sb.append(deque.peekLast()).append("\n");
break;
}
}
}
}
System.out.println(sb);
}
}
'연습문제 > JAVA' 카테고리의 다른 글
[백준 java] 7576 - 토마토 (0) | 2022.09.05 |
---|---|
[백준 java] 1874 - 스택 수열 (0) | 2022.09.04 |
[java 백준] 1021 - 회전하는 큐 (0) | 2022.09.03 |
[백준 java] 3425 - 고스텍 (0) | 2022.09.02 |
[백준 java] 1654 - 랜선자르기 (0) | 2022.08.30 |