728x90

문제

() = 2, [] = 3 이고

(x) = 2 * x, [x] = 3 * x 일 때

괄호로만 이루어진 문자열의 계산 결과를 구하는 문제

 

(잘못된 괄호인 경우에는 무조건 0을 출력)

 

접근 방식

문제의 이해는 쉽지만 구현이 어려웠던 문제다.

(()[[]])([])

(
((
(()
(2
(2[
(2+[[
(2+[[]
(2+[3
(2+[3]
(2+9
(11
(11)
22
22+(
22+([
22+([]
22+(3
22+(3)
22+6
28

 

주어진 문자열에 대한 계산 순서는 위와 같은데

문제를 자세히 읽어 보면 잘못된 괄호의 경우에는 생각할 필요가 없고

제대로 된 괄호의 경우만 생각하면 된다.

 

즉, 모든 괄호가 알맞게 짝지어져 있다는 가정 하에 계산을 하면 되는데

() = 2니까 (()) = 2의 제곱, ((())) = 2의 3제곱이 되고,

[] = 3이니 [[]] = 3의 제곱, [[[]]] = 3의 3제곱이 된다.

 

소괄호가 들어오면 num에 2를 곱해주고 대괄호가 들어오면 3을 곱해준 다음에

괄호가 닫히면 더해주고 닫힌 괄호로 다시 나눠주면 된다.

 

풀이

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		char[] input = br.readLine().toCharArray();

		Stack<Character> stack = new Stack<>();

		int sum = 0;
		int num = 1;

		for (int i = 0; i < input.length; i++) {
			char c = input[i];

			if (c == '(') {
				stack.push(c);
				num *= 2;
			} else if (c == '[') {
				stack.push(c);
				num *= 3;
			} else if (c == ')') {
				if (stack.isEmpty() || stack.peek() != '(') {
					System.out.println(0);
					return;
				}

				stack.pop();

				if (input[i - 1] == '(') {
					sum += num;
				}
				num /= 2;
			} else {
				if (stack.isEmpty() || stack.peek() != '[') {
					System.out.println(0);
					return;
				}

				stack.pop();

				if (input[i - 1] == '[') {
					sum += num;
				}
				num /= 3;
			}
		}

		if (stack.isEmpty()) {
			System.out.println(sum);
		} else {
			System.out.println(0);
		}
	}
}

 

'Java > Algorithms' 카테고리의 다른 글

[BFS] 구현 및 팁  (1) 2023.10.09
[백준] 1926번 : 그림  (1) 2023.10.09
[백준] 10799번 : 쇠막대기  (0) 2023.10.07
[백준] 3986번 : 좋은 단어  (0) 2023.10.07
[백준] 4949번 : 균형잡힌 세상  (0) 2023.10.05

+ Recent posts