Coding Test/baekjoon

[백준 3425] 고스택- 자바(solved.ac - 골드 4)

조용장 2023. 3. 21. 00:09

https://www.acmicpc.net/problem/3425

 

3425번: 고스택

각각의 입력값에 대해서, 해당하는 프로그램을 수행한 뒤, 출력값을 출력하면 된다. 출력값이란 스택에 저장되어 있는 숫자이다. 만약, 프로그램 에러가 발생하거나, 모든 수행이 종료됐을 때

www.acmicpc.net

풀이

문제를 보았을 때 알 수 있는 힌트

고스택이라는 10가지의 조건을 잘 맞춰서 문제를 풀면 되는 문제이다.

여기에서 핵심은 ERROR를 어떻게 발견하고 추출하냐 문제인듯하다.

합이 10의 9승을 넘어가는 경우

0으로 나누는 경우

합칠것이 2개 이상이 아닌경우

추가할경우 1개이상이 아닌 경우

마지막에 리스트가 1개 이상인 경우

이렇게만 잘 조심해서 문제를 풀면 쉽게 풀수 있는 문제이다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

// baekjoon 3425
public class Main {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static StringBuilder sb = new StringBuilder();
	static List<String> input;
	public static long MAX = 1000000000;

	public static void main(String[] args) throws IOException {
		// 숫자만 저장 가능
		while (true) {
			input = new ArrayList<>();
			while (true) {
				String[] temp = br.readLine().split(" ");
				// 종료 해버렷!
				if (temp[0].equals("QUIT")) {
					System.out.println(sb);
					return;
				}
				if (temp[0].equals("END")) {
					break;
				}
				if(temp.length==1) {
					input.add(temp[0]);
                }
                else {
                	input.add(temp[0]+" "+temp[1]);
                    
                }
			}
			//
			int count = Integer.parseInt(br.readLine());
			for (int i = 0; i < count; i++) {
				Program(Long.parseLong(br.readLine()));
			}
			System.out.println();
		}

	}

	static void Program(Long num) {
		ArrayDeque<Long> ans = new ArrayDeque();
		ans.addFirst(num);
		boolean flag = false;
		for (String s : input) {
			if (flag) {
				break;
			}
			switch (s.split(" ")[0]) {
			case "NUM":
				ans.addFirst(Long.parseLong(s.split(" ")[1]));
				break;
			case "POP":
				if (ans.size() < 1) {
					flag = true;
					break;
				}
				ans.removeFirst();
				break;
			case "INV": {
				if (ans.size() < 1) {
					flag = true;
					break;
				}
				Long a = ans.removeFirst();
				ans.addFirst(a * -1);
				break;
			}
			case "DUP":
				if (ans.size() < 1) {
					flag = true;
					break;
				}
				ans.addFirst(ans.peek());
				break;
			case "SWP": {
				if (ans.size() < 2) {
					flag = true;
					break;
				}
				Long a = ans.removeFirst();
				Long b = ans.removeFirst();
				ans.addFirst(a);
				ans.addFirst(b);
				break;
			}
			case "ADD": {
				if (ans.size() < 2) {
					flag = true;
					break;
				}
				Long a = ans.removeFirst();
				Long b = ans.removeFirst();
				if (Math.abs(a + b) > MAX) {
					flag = true;
					break;
				}

				ans.addFirst(a + b);
				break;
			}
			case "SUB": {
				if (ans.size() < 2) {
					flag = true;
					break;
				}
				Long a = ans.removeFirst();
				Long b = ans.removeFirst();
				if (Math.abs(b - a) > MAX) {
					flag = true;
					break;
				}
				ans.addFirst(b - a);
				break;
			}
			case "MUL": {
				if (ans.size() < 2) {
					flag = true;
					break;
				}
				Long a = ans.removeFirst();
				Long b = ans.removeFirst();
				if (Math.abs(a * b) > MAX) {
					flag = true;
					break;
				}
				ans.addFirst(a * b);
				break;
			}
			case "DIV": {
				if (ans.size() < 2) {
					flag = true;
					break;
				}
				int minus_cnt = 0;
				Long a = ans.removeFirst();
				Long b = ans.removeFirst();
				if (a < 0) {
					minus_cnt++;
				}
				if (b < 0) {
					minus_cnt++;
				}
				if (a == 0) {
					flag = true;
					break;
				}
				long div = Math.abs(b) / Math.abs(a);
				if (minus_cnt == 1) {
					ans.addFirst(div * -1);
				} else {
					ans.addFirst(div);
				}

				break;
			}
			case "MOD": {
				if (ans.size() < 2) {
					flag = true;
					break;
				}
				Long a = ans.removeFirst();
				Long b = ans.removeFirst();
				if (a == 0) {
					flag = true;
					break;
				}
				long mod = Math.abs(b) % Math.abs(a);
				if (b < 0) {
					mod *= -1;
				}
				ans.addFirst(mod);
				break;
			}
			default:
				break;
			}
//			System.out.println(s+":"+ans);
		}
		if (!flag && ans.size() == 1)
			System.out.println(ans.getFirst());
		else
			System.out.println("ERROR");

	}
}

https://github.com/dydwkd486/coding_test/blob/main/baekjoon/java/baekjoon3425/Main.java

 

GitHub - dydwkd486/coding_test: 코딩테스트 공부한 내용 정리

코딩테스트 공부한 내용 정리. Contribute to dydwkd486/coding_test development by creating an account on GitHub.

github.com