728x90
1. 문제
2. 풀이
후위연산식으로 바꾸기
1. '('라면 연산자스택에 push
2. 숫자라면 후위연산식에 더하기
3. 1,2 모두 아니라면 <스택이 비거나 peek이 '('가 아니고 우선순위가 나(ch)보다 클 때> pop하며 후위연산식에 계속 더해준다.
4. ')'라면 마지막에 '('가 남았을것이므로 pop을 해주고, 부호라면 연산자스택에 push한다.
* 우선순위 체크 함수
괄호면 0, +-는 1, */는 2를 반환했다. -1은 오류값.
스택을 이용한 후위연산식 계산방법은 [SWEA] 1223 계산기2 와 동일하다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class D4_1224_계산기3 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
for (int tc = 1; tc <= 10; tc++) {
int len = Integer.parseInt(in.readLine());
String line = in.readLine();
//postfix로 바꾸기
StringBuilder postfix = new StringBuilder();
Stack<Character> operator = new Stack<>();
for (int i = 0; i < len; i++) {
char ch = line.charAt(i);
if (ch == '(') {
operator.push(ch);
continue;
}
else if(ch>='0' && ch<='9'){
postfix.append(ch);
continue;
}
//여기서부터는 ), 부호만 남음
while (!operator.empty() && operator.peek() != '(' && checkPriority(operator.peek()) >= checkPriority(ch)) {
postfix.append(operator.pop());
}
if(ch==')') operator.pop();
else operator.push(ch);
}
//stack에 넣어가면서 계산하기
Stack<Integer> calculator = new Stack<>();
for (int i = 0; i < postfix.length(); i++) {
char ch = postfix.charAt(i);
switch (ch) {
case '+':
calculator.push(calculator.pop() + calculator.pop());
break;
case '*':
calculator.push(calculator.pop() * calculator.pop());
break;
default:
calculator.push(ch - '0');
break;
}
}
//출력하기
System.out.println("#" + tc + " " + calculator.pop());
}
}
//우선순위 체크 함수
public static int checkPriority(char ch){
switch(ch){
case '(': case ')':return 0;
case '+': case '-':return 1;
case '*': case '/':return 2;
}
return -1;
}
}
3. 결과
가장 아래에 있는 결과는 아스키코드값을 이용해 우선순위를 판단했다. 이 문제는 그렇게 해도 통과가 되지만(부호가 +,*밖에 없음) -나 /가 등장할 경우 적용하기 힘들다.
그래서 우선순위 판단 함수를 따로 만들었다.
중간 결과는 약간 시행착오인데, 우선순위 함수를 만들고 나서 적용만 한 코드다.
함수를 만들고보니 필요없는 코드들이 생겨서 좀 더 지워주고 다시 실행했다. 오히려 아스키코드를 이용할 때보다 더 코드도 짧고 실행시간도 아주 약간 짧아졌다.
+ 처음코드
+ 두번째코드
+ 마지막 코드(위와 동일)
'코딩테스트 > SWEA' 카테고리의 다른 글
[SWEA] 1233 사칙연산 유효성 검사 - JAVA (0) | 2022.02.11 |
---|---|
[SWEA] 1210 Ladder1 - JAVA (0) | 2022.02.09 |
[SWEA] 1223 계산기2 - JAVA (0) | 2022.02.09 |
[SWEA] 1861 정사각형 방 - JAVA (0) | 2022.02.09 |
[SWEA] 3499 퍼펙트셔플 (0) | 2022.02.09 |
댓글