[SWEA] 1223 계산기2

SWEA.1223 계산기2

이 문제 하나 푸는데 3시간 걸렸다. 뭔가 스택을 이용해서 풀려고 하다가, 너무 오래걸려서 그냥 스트링의 메소드를 활용해서 풀었다.

보충수업시간에 강사님이랑 같이 풀었던 쇠막대기 문제와, 수업시간에 괄호 판별문제를 다른 교육생이 String의 replace메소드를 활용해서 푼 것이 떠올라서, 비슷한 방식으로 풀었다.
코드는 제일 짧은데, 그렇다고 메모리나 실행시간까지 좋은건 아니다.
보통 계산기 하면 스택 자료구조를 많이 생각하는데, 아직은 스택을 어떤식으로 활용해야할지 감이 잘 안잡힌다.

특별히 이 문제에서 계산기에 덧셈과 곱셈 밖에 없어서 문자열로 생각해서 푸는게 훨씬 쉬웠다.
곱셈을 모두 없애고, 덧셈 연산자를 기준으로 문자열을 split시켰다.
그 이후에 나뉜 각각의 문자열을 순회하면서 val에 곱한 값을 누적시키고 이걸 result에 계속 더해줬다.

package _0205;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class SW1223Calculator {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		for (int testCase = 1; testCase <= 10; testCase++) {
			br.readLine();
			String s  =  br.readLine().replace("*","");
			String[] arr= s.split("[+]");
			long result  = 0;
			long val = 1;
			for (int i = 0; i < arr.length; i++) {
				val = 1;
				for (int j = 0; j < arr[i].length(); j++) {
					val *= arr[i].charAt(j)-'0';
				}
				result+=val;
			}
			sb.append("#").append(testCase).append(" ").append(result).append('\n');
		}
		System.out.print(sb);

	}

}

이 방법으로 하면 이 문제는 빠르게 풀 수 있겠지만, 만약 뺄셈과 나눗셈이 들어가는 경우에는 어떻게 해야할지 감이 잘 안잡힌다. 뺄셈과 나눗셈은 연산자의 순서가 중요하기 때문에 아마 후위 연산자로 식을 변형시킨 이후에 하나씩 꺼내면서 계산해줘야 할 것 같다.
글을 쓰다보니 생각났는데 이 문제도 입력을 받으면서 스택 2개를 이용해서 식을 후위 표기식으로 바꾸고, 하나씩 연산을 수행하면 될 것같다.
애초에 문제에서 제시하는 풀이 방향은 문자열로 이루어진 계산식이 주어질 때, 이 계산식을 후위 표기식으로 바꾸어 계산하는 프로그램을 작성 하라고 했으니깐, 이 방법이 맞는 것 같다.