문제 출처: https://www.acmicpc.net/problem/1541
+, -, 숫자(최대 5자리)가 포함된 문자열이 주어진다. 받은 문자열을 파싱하여 연산가능한 최소 수를 리턴하시오.
55-50+40
10+20+30+40
00009-00009
-35
100
0
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
String sample = br.readLine();
StringBuilder sb = new StringBuilder();
Stack<Character> ops = new Stack<>();
Stack<Integer> nums = new Stack<>();
for (int i = 0; i < sample.length(); i++) {
char c = sample.charAt(i);
if (opCheck(c)) {
ops.push(c);
nums.push(Integer.parseInt(sb.toString()));
sb.setLength(0);
} else {
sb.append(c);
}
}
nums.push(Integer.parseInt(sb.toString()));
System.out.println(calculate(ops, nums));
br.close();
}
public static boolean opCheck(char c) {
return "-+".contains(c + "") ? true : false;
}
public static int calculate(Stack<Character> ops, Stack<Integer> nums) {
Stack<Character> ops2 = new Stack<>();
Stack<Integer> nums2 = new Stack<>();
int current = nums.pop();
while (!ops.isEmpty()) {
if(ops.peek() == '-') {
ops2.push(ops.pop());
nums2.push(current);
current = nums.pop();
} else {
current += nums.pop();
ops.pop();
}
}
int answer = current;
while(!ops2.isEmpty()) {
answer -= nums2.pop();
ops2.pop();
}
return answer;
}
}
문자열 파싱 후 스택을 이용하여 더하기 연산을 모두 해준 후 뺴기 연산을 하여 문제를 풀었다.
문제를 푸는데 30분 정도 소요됬는데 다른 문제 풀이를 보니 성능 면에서는 별로지만 split() 함수를 사용하였다면 더 짧은 코드로 빨리 풀 수 있었을것 같다.