1. 문제
1-1. 링크
1-2. 문제 해석
2. 코드
3. 실행시간
1. 문제
1-1. 링크
1-2. 문제 해석
후위 표기법에 대한 지식이 있다면 쉽게 풀 수 있는 문제이다.
이 포스팅 안에서 다 설명하기엔 너무 길어서 따로 글을 올렸으니 다음 링크를 참고하면 된다.
2. 코드
public class Day5_1224_계산기3 {
static HashMap<Character, Integer> priority = new HashMap<>(); // 우선순위
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
priority.put('+', 1);
priority.put('-', 1);
priority.put('*', 2);
priority.put('/', 2);
priority.put('(', Integer.MIN_VALUE);
for (int tc = 1; tc <= 10; tc++) {
br.readLine();
String postfix = infixToPostfix(br.readLine());
System.out.println(postfix);
int result = calPostfix(postfix);
sb.append("#" + tc + " " + result + "\n");
}
System.out.println(sb.toString());
}
public static String infixToPostfix(String str) {
Stack<Character> stack = new Stack<Character>();
StringBuilder postfix = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (Character.isDigit(ch)) { // 숫자인 경우
postfix.append(ch);
} else if (stack.isEmpty() || ch == '(') { // 스택이 비어있거나 '('인 경우
stack.add(ch);
} else if (ch == ')') { // ')'인 경우
while (!stack.isEmpty() && stack.peek() != '(') {
postfix.append(stack.pop());
}
stack.pop(); // '(' 버리기
} else { // 연산자가 들어오는 경우
while (!stack.isEmpty() && priority.get(stack.peek()) >= priority.get(ch)) {
postfix.append(stack.pop());
}
stack.add(ch);
}
}
while (!stack.isEmpty()) {
postfix.append(stack.pop());
}
return postfix.toString();
}
public static int calPostfix(String str) {
Stack<Integer> numStack = new Stack<>();
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (Character.isDigit(ch)) {
numStack.add(ch - '0');
} else {
int right = numStack.pop();
int left = numStack.pop();
numStack.add(calculate(left, right, ch));
}
}
return numStack.pop();
}
public static int calculate(int a, int b, char op) {
switch (op) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
default:
return a / b;
}
}
}
우선순위를 비교하기 위해 HashMap 구조를 사용했다.
선언과 동시에 초기화를 하고 싶었지만 SWEA의 자바 컴파일 버전이 낮아서 그런지 내가 아는 방법이 안 통해서
그냥 일일이 추가를 시켜줬다.
3. 실행시간
실행시간은 이렇게 나왔다. 머쓱...
반응형
'문제 풀이 > SWEA' 카테고리의 다른 글
1226번 - 미로1 (0) | 2021.08.10 |
---|---|
1267번 - 작업순서 (0) | 2021.08.09 |
1219번 - 길찾기 (0) | 2021.08.07 |
1218번 - 괄호 짝짓기 (0) | 2021.08.05 |
1216번 - 회문2 (0) | 2021.08.04 |
댓글