백준 2504 - 괄호의 값

백준 2504 - 괄호의 값

https://www.acmicpc.net/problem/2504

★ 풀이

식의 성립 여부는 stack을 통해 확인 할 수 있으며, 식의 계산은 분배법칙을 통해 처리해 준다.

먼저 구상은 위와 같이 했다.

연산

열리는 괄호 { ( 는 각각 *3과 *2를 의미한다. 일단 괄호가 열리면 열린 괄호 안에 들어가는 모든 값들은 감싸고 있는 괄호의 영향 안에 들어가게 된다(=분배법칙). 따라서 점점 여는 괄호가 많아 질수록 *연산이 중첩해서 이루어 진다. 하지만 닫는 괄호 ) ] 가 나온다면 그 영향이 끝나게 되므로 / 연산을 통해 영향을 제거해준다. 중요한 것은 식의 결과값을 구하기 위해서는 () 와 [] 에서만 누적값을 합해주어야 한다는 것이다. 왜냐하면 말 그대로 누적값이므로.. 한번 계산해 주면 이전 등장한 열린 괄호들의 값을 모두 처리해준 것이므로 또 계산하면 안된다.

성립 여부

연산은 위와 같이 하면 되지만 식의 성립 여부는 또 따로 처리해주어야 한다. 열린 괄호와 닫힌 괄호의 짝이 맞아야 하므로 stack을 통해 선입후출의 원리로 짝이 맞는 괄호들을 제거해주면서 식의 성립 여부를 판단해주면 되는데, 잊지 말아햐 할것은 [[[[[[] 와 같은 예외가 존재하므로 마지막에는 stack이 비어야 한다는 것이다.

★ 소스 코드

import java.io.*; import java.util.*; // 좋은 코드 흡수하기! public class Main { static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); static String s; static Stack stack; public static void main(String[] args) throws IOException { s = br.readLine(); stack = new Stack<>(); int temp = 1; int sum = 0; for(int i = 0; i

from http://sweet-smell.tistory.com/76 by ccl(A) rewrite - 2021-11-13 17:01:38