728x90
문제
풀이
/*
* 1. 10개의 테스트 케이스
* 2. 첫 줄에 테스트 케이스의 길이 N
* 3. 테스트케이스
* 4. 후위 표기식으로 바꿔야 함 >> 스택 사용
* 5. +, *가 나오면 계산하고 아니면 숫자 저장하기 >> switch?? >> if
* 6. 출력: "#" + tc + " " + result;
*/
*가 +보다 우선순위가 높기 때문에 (s1.peek() == '*' || s1.peek() == '+')를 써 줬지만 이 문제는 *랑 +밖에 없기 때문에 굳이 쓰지 않아도 답은 맞게 나온다
코드
package com.ssafy.im;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class D4_1223_계산기2 {
public static void main(String[] args) throws NumberFormatException, IOException {
File file = new File("D4_1223_계산기2.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
//BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Stack<Character> s1 = new Stack<>(); //후위식으로 바꾸기
Stack<Integer> s2 = new Stack<>(); //식 계산
for(int tc = 1; tc <= 10; tc++) {
int N = Integer.parseInt(br.readLine());
String str = br.readLine(); //받은 식
String cal = ""; //후위식
for(int i = 0; i < N; i++) {
char c = str.charAt(i);
if(c-'0' >= 0 && c-'0' <= 9) {//c가 숫자라면
cal += c;
} else if(c == '*') { //*일때
s1.push(c);
} else if(c == '+') { //+일때
while(!s1.empty() && (s1.peek() == '*' || s1.peek() == '+')) cal+=s1.pop(); //*나 +가 있으면 pop();
s1.push(c);
}
}
while(!s1.empty()) cal+=s1.pop(); //남은 식 전부 cal로 넣기
for(int i = 0; i < N; i++) {
char c = cal.charAt(i);
if(c-'0' >= 0 && c-'0' <= 9) {//c가 숫자라면
s2.push(c-'0'); //s2에 넣기
} else if(c == '+') {
s2.push(s2.pop() + s2.pop()); //숫자 두 개 꺼내서 더한 뒤 다시 넣기
} else if(c == '*') {
s2.push(s2.pop() * s2.pop()); //숫자 두 개 꺼내서 곱한 뒤 다시 넣기
}
}
System.out.println("#" + tc + " " + s2.pop());
}
}
}
결과
#자바 #java #swea #알고리즘
728x90
'알고리즘 > SWEA' 카테고리의 다른 글
[java][swea][d4] 1233. 사칙연산 유효성 검사 (0) | 2022.02.10 |
---|---|
[java][swea][d4] 1224. 계산기3 (0) | 2022.02.09 |
[java][swea][d4] 1861. 정사각형 방 (0) | 2022.02.09 |
[java][swea][d4] 1210. Ladder1 (0) | 2022.02.09 |
[java][swea][d3] 1210. 퍼펙트셔플 (0) | 2022.02.09 |