본문 바로가기
알고리즘/백준

[백준/자바] 18258 큐 2

by Renechoi 2022. 11. 28.

[백준/자바] 18258 큐 2

 

📌 문제 

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

 

 

⚔ 입력

첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.

 

 

📣 출력

출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

 

 

 

 


 

 

 

💎 문제분석하기

 

자료구조 큐의 명령어를 구현하면 되는 문제이다. 

 

if나 case 조건절 분기를 사용하지 않고 enum을 활용한 호출로 구현한 방식이다.  

 

 

 

💡 코드 구현하기

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;
import java.util.StringTokenizer;

public class Main {

	public static Deque<Integer> deque = new ArrayDeque<>();
	public static int size = 0;
	public static int pushValue;
	public static StringBuilder stringBuilder;

	public static void main(String[] args) throws IOException {
		BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine(), " ");
		int N = Integer.parseInt(stringTokenizer.nextToken());

		stringBuilder = new StringBuilder();
		while (N-- > 0) {
			stringTokenizer = new StringTokenizer(bufferedReader.readLine(), " ");
			String command = stringTokenizer.nextToken();
			if (command.equals("push")) {
				pushValue = Integer.parseInt(stringTokenizer.nextToken());
			}
			Arrays.stream(DequeCommand.values())
					.filter(commands -> commands.commandName.equals(command))
					.findFirst()
					.orElse(DequeCommand.NoneObject)
					.dequeCommand.command();
		}

		System.out.println(stringBuilder);
	}

	public interface Command {
		void command();
	}

	public enum DequeCommand {
		pushCommand("push", new Command() {
			@Override
			public void command() {
				deque.offer(pushValue);
			}
		}),

		frontCommand("front", () -> {
			Integer front = deque.peek();
			if (front == null) {
				stringBuilder.append(-1).append('\n');
			} else {
				stringBuilder.append(front).append('\n');
			}
		}),

		backCommand("back", () -> {
			Integer last = deque.peekLast();
			if (last == null) {
				stringBuilder.append(-1).append('\n');
			} else {
				stringBuilder.append(last).append('\n');
			}
		}),

		sizeCommand("size", () -> {
			stringBuilder.append(deque.size()).append('\n');
		}),

		emptyCommand("empty", () -> {
			if (deque.isEmpty()) {
				stringBuilder.append(1).append('\n');
			} else {
				stringBuilder.append(0).append('\n');
			}
		}),

		popCommand("pop", () -> {
			Integer value = deque.poll();
			if (value == null) {
				stringBuilder.append(-1).append('\n');
			} else {
				stringBuilder.append(value).append('\n');
			}
		}),

		NoneObject("", () -> {
			throw new RuntimeException();
		});

		private final String commandName;
		private final Command dequeCommand;

		DequeCommand(String commandName, Command dequeCommand) {
			this.commandName = commandName;
			this.dequeCommand = dequeCommand;
		}
	}

}

 

 

 

 

 

 

 

 

 


 

 

 

풀이 참고 : Do it! 알고리즘 코딩테스트 - 자바 편

반응형