JAVA/JAVA Algorithm

[백준] 18258번 큐2

오늘의 진 2022. 8. 28. 00:08

문제

정수를 저장하는 큐를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 여섯 가지이다.

  • push X: 정수 X를 큐에 넣는 연산이다.
  • pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 큐에 들어있는 정수의 개수를 출력한다.
  • empty: 큐가 비어있으면 1, 아니면 0을 출력한다.
  • front: 큐의 가장 앞에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • back: 큐의 가장 뒤에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.

입력

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 2,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

 

(구상)

 

입력 : 버퍼리더로 받아서 스위치문으로 하나하나 구현해주자.

 

 

 처음 작성한 코드 

package codingTest;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Algoritm15 {

	public static void main(String[] args) throws Exception {

		Scanner sc = new Scanner(System.in);

		String an;
		String addnum = "";

		Queue<String> qu = new LinkedList<String>();

		int num = sc.nextInt();
		sc.nextLine();

		for (int i = 0; i < num; i++) {

			an = sc.nextLine();

			String instruction[] = an.split(" ");

			switch (instruction[0]) {
			case "front": {
				if (qu.isEmpty()) {
					System.out.println(-1);
				} else {
					System.out.println(qu.peek());
				}

				break;

			}

			case "empty": {
				if (qu.isEmpty()) {
					System.out.println(1);
				} else {
					System.out.println(0);
				}
				break;
			}

			case "pop": {

				if (qu.isEmpty()) {
					System.out.println(-1);
				} else {
					System.out.println(qu.poll());
				}
				break;

			}

			case "size": {
				System.out.println(qu.size());
				break;
			}

			case "back": {
				if (qu.isEmpty()) {
					System.out.println(-1);
				} else {
					System.out.println(addnum);
				}

				break;
			}

			default:
				addnum = instruction[1];

				qu.add(instruction[1]);
				break;
			}

		}
	}
}

 돌아가긴하지만 시간초과! 

 

그래서 생각해 준것은 여러번 출력하니 시간이 걸리는 것 같아서 

출력할 문구를 모두 sb에 담아서 출력해 주는 방법을 선택해 주었다. 

문구를 담을  Stringbuilder을 만들어서 출력할 문구들을 모두 append 해준 다음 for문이 끝난 이후에 sb를 출력해 줌

package codingTest;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
import java.util.Deque;
import java.util.LinkedList;

public class Algorithm15_3 {

	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();

		Deque<Integer> q = new LinkedList<>();

		int N = Integer.parseInt(br.readLine());

		StringTokenizer st;

		for (int i = 0; i < N; i++) {

			st = new StringTokenizer(br.readLine(), " ");

			switch (st.nextToken()) {

			case "push":

				q.offer(Integer.parseInt(st.nextToken()));
				break;

			case "pop":

				Integer item = q.poll();
				if (item == null) {
					sb.append(-1).append('\n');
				} else {
					sb.append(item).append('\n');
				}
				break;

			case "size":
				sb.append(q.size()).append('\n');
				break;

			case "empty":
				if (q.isEmpty()) {
					sb.append(1).append('\n');
				} else {
					sb.append(0).append('\n');
				}
				break;

			case "front":
				Integer ite = q.peek();
				if (ite == null) {
					sb.append(-1).append('\n');
				} else {
					sb.append(ite).append('\n');
				}
				break;

			case "back":
				Integer it = q.peekLast();
				if (it == null) {
					sb.append(-1).append('\n');
				} else {
					sb.append(it).append('\n');
				}
				break;
			}

		}

		System.out.println(sb);

	}
}