본문 바로가기
문제 풀이/SWEA

1224번 - 계산기3

by Kim Juhwan 2021. 8. 9.

문제의 저작권은 SW Expert Academy에 있습니다.

1. 문제
   1-1. 링크
   1-2. 문제 해석
2. 코드
3. 실행시간

 

 

 


 

1. 문제

1-1. 링크

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

1-2. 문제 해석

후위 표기법에 대한 지식이 있다면 쉽게 풀 수 있는 문제이다.

이 포스팅 안에서 다 설명하기엔 너무 길어서 따로 글을 올렸으니 다음 링크를 참고하면 된다.

 

중위 표기법과 후위 표기법

1. 개념  1-1. 중위 표기법이란?  1-2. 후위 표기법이란? 2. 중위 표기식을 후위 표기식으로 바꾸는 법  2-1. 괄호가 없는 경우  2-2. 괄호가 있는 경우 3. 계산  3-1. 후위 표기식을 사칙연산하는 법 1.

todaycode.tistory.com

 

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. 실행시간

6등... 머쓱...

 

실행시간은 이렇게 나왔다. 머쓱...

 

 

 

반응형

'문제 풀이 > 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

댓글