백준 - 잃어버린 괄호[java]

스브코·2022년 1월 25일
0

greedy algorithm

목록 보기
3/4

문제 출처: 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() 함수를 사용하였다면 더 짧은 코드로 빨리 풀 수 있었을것 같다.

profile
익히는 속도가 까먹는 속도를 추월하는 그날까지...

0개의 댓글