풀다가 환장할뻔한 문제다.
문제가 어려운건 아닌데 꼼꼼하게 풀어야 할 문제
정답비율 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 |