본문 바로가기

연습문제/JAVA

[백준 java] 3425 - 고스텍

 

3425번: 고스택

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

www.acmicpc.net

 

풀다가 환장할뻔한 문제다.

문제가 어려운건 아닌데 꼼꼼하게 풀어야 할 문제

정답비율 14%가 괜히 14%가 아니었다...

한 프로그램을 입력받고 해당 프로그램에 관한 결과를 출력하다가

문자열"QUIT" 를 받으면 끝내는 문제이다.

 

문제의 첫번째 숫자는 스택의 맨 위에 숫자

그리고 두번째 숫자는 맨 위에서 두번째 숫자라는것을 알아두자

 

만약 문자열 NUM X 가 들어온다면

문자열 NUM은 cmd list에 넣고 숫자 Long 은 numArr에 추가하였다.

NUM을 연산할때는 numArr에 있는 숫자를 꺼내쓰고 count++를 하여

numArr 꺼낼 index를 바꿔줬다.

 

 

!! 주의할점 !!

1. 나누기 / 나누기

여기서 0으로 나누면 안되지만 > error 출력

0을 나누는건 가능하다 > 0 출력

 

 

2. 곱하기 / 곱하기는 Long

int 105000 * int 105000이상은 int의 범위를 벗어나므로 long타입으로 연산하자

long a = 105000;
long b = 105000;
long c = a*b;

 

 

3. 한 프로그램이 끝난 후 엔터 입력받기

 

 

4. 바로 END가 들어올 시 받은 숫자 그대로 출력

END
1
1

의 결과값은 1이다.

 

 

5. 결과 범위는 -10^9 ~ 10^9 사이의 숫자이다

따라서 10^9 만 신경쓰면 안되고 음수도 신경써야한다


 

package com.exam.자료구조;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class B3425 {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        while(true) {
            StringBuilder sb = new StringBuilder();
            ArrayList<String> cmd = new ArrayList<>();
            ArrayList<Long> numArr = new ArrayList<>();
            while (true) {
                st = new StringTokenizer(bf.readLine(), " ");
                String str = st.nextToken();
                if(Objects.equals(str, "QUIT")) {
                    return;
                }
                if (Objects.equals(str, "END")) break;
                if (Objects.equals(str, "NUM")) {
                    long n = Long.parseLong(st.nextToken());
                    cmd.add(str);
                    numArr.add(n);
                } else {
                    cmd.add(str);
                }
            }

            int N = Integer.parseInt(bf.readLine());
            for (int i = 0; i < N; i++) {
                start(cmd, numArr,  Long.parseLong(bf.readLine()), sb);
            }
            cmd.clear();
            numArr.clear();
            System.out.println(sb);
            String str = bf.readLine();
        }
    }


    private static void start(ArrayList<String> cmd, ArrayList<Long> numArr, long i, StringBuilder sb) {
        ArrayList<Long> intArr = new ArrayList<>();
        intArr.add(i);
        int count = 0;
        for(String s : cmd){
            switch (s){
                case "NUM" : {
                    intArr.add(numArr.get(count));
                    count++;
                    break;
                }
                case "POP" : {
                    if(intArr.size()<1){
                        sb.append("ERROR").append('\n');
                        return;
                    }
                    intArr.remove(intArr.size()-1);
                    break;
                }
                case "INV" : {
                    if(intArr.size()<1){
                        sb.append("ERROR").append('\n');
                        return;
                    }
                    if(intArr.get(intArr.size()-1)==0){
                        intArr.set(intArr.size()-1, (long) 0);
                    }else {
                        long num = intArr.get(intArr.size() - 1);
                        intArr.set(intArr.size() - 1, num * -1);
                    }
                    break;
                }
                case "DUP" : {
                    if(intArr.size()<1){
                        sb.append("ERROR").append('\n');
                        return;
                    }
                    intArr.add(intArr.get(intArr.size()-1));
                    break;
                }
                case "SWP" : {
                    if(intArr.size()<2){
                        sb.append("ERROR").append('\n');
                        return;
                    }
                    long temp = (intArr.get(intArr.size()-1));
                    intArr.set(intArr.size()-1,intArr.get(intArr.size()-2));
                    intArr.set(intArr.size()-2,temp);
                    break;
                }
                case "ADD" : {
                    if(intArr.size()<2){
                        sb.append("ERROR").append('\n');
                        return;
                    }

                    long num = intArr.get(intArr.size()-2) + intArr.get(intArr.size()-1);
                    if(Math.abs(num)>1000000000) {
                        sb.append("ERROR").append('\n');
                        return;
                    }
                    intArr.remove(intArr.size()-1);
                    intArr.remove(intArr.size()-1);
                    intArr.add(num);
                    break;
                }
                case "SUB" : {
                    if(intArr.size()<2){
                        sb.append("ERROR").append('\n');
                        return;
                    }
                    long num = intArr.get(intArr.size()-2) - intArr.get(intArr.size()-1);
                    if(Math.abs(num)>1000000000) {
                        sb.append("ERROR").append('\n');
                        return;
                    }
                    intArr.remove(intArr.size()-1);
                    intArr.remove(intArr.size()-1);
                    intArr.add(num);
                    break;
                }
                case "MUL" : {
                    if(intArr.size()<2){
                        sb.append("ERROR").append('\n');
                        return;
                    }
                    long num = intArr.get(intArr.size()-2) * intArr.get(intArr.size()-1);
                    if(Math.abs(num)>1000000000) {
                        sb.append("ERROR").append('\n');
                        return;
                    }
                    intArr.remove(intArr.size()-1);
                    intArr.remove(intArr.size()-1);
                    intArr.add(num);
                    break;
                }
                case "DIV" : {
                    if(intArr.size()<2){
                        sb.append("ERROR").append('\n');
                        return;
                    }
                    if(intArr.get(intArr.size()-1)==0){
                        sb.append("ERROR").append('\n');
                        return;
                    }
                    long num = intArr.get(intArr.size()-2) / intArr.get(intArr.size()-1);
                    intArr.remove(intArr.size()-1);
                    intArr.remove(intArr.size()-1);
                    intArr.add(num);
                    break;
                }
                case "MOD" : {
                    if(intArr.size()<2){
                        sb.append("ERROR").append('\n');
                        return;
                    }
                    if(intArr.get(intArr.size()-1)==0 ){
                        sb.append("ERROR").append('\n');
                        return;
                    }
                    long num =  intArr.get(intArr.size()-2) % intArr.get(intArr.size()-1);
                    intArr.remove(intArr.size()-1);
                    intArr.remove(intArr.size()-1);
                    intArr.add(num);
                    break;
                }
            }
        }



        if(intArr.size()!=1) sb.append("ERROR").append('\n');
        else sb.append(intArr.get(0)).append('\n');
    }
}

 

끔찍했다...

 

'연습문제 > JAVA' 카테고리의 다른 글

[백준 java] 10866 - 덱  (0) 2022.09.04
[java 백준] 1021 - 회전하는 큐  (0) 2022.09.03
[백준 java] 1654 - 랜선자르기  (0) 2022.08.30
[백준 java] 7662 - 이중 우선순위 큐  (0) 2022.08.29
[백준 java] 1068 - 트리  (0) 2022.08.27