본문 바로가기
Algorithm

[백준] 2504

by ikii 2023. 8. 29.

코드 1, 성공, 230825


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Stack;


public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        Stack<Character> stack = new Stack<Character>();
        int result = 0;
        int value = 1;


        for(int i = 0; i<str.length(); i++){
            if (str.charAt(i) == '(') {
                stack.add(str.charAt(i));
                value *= 2;
            } else if (str.charAt(i) == '[') {
                stack.add(str.charAt(i));
                value *= 3;
            } else if(str.charAt(i) == ')') {
                if(stack.empty()){
                    System.out.println(0);
                    return;
                } else {
                    if (str.charAt(i-1) == '(') {
                        result += value;
                    } else {
                        if (stack.peek() != '('){
                            System.out.println(0);
                            return;
                        }
                    }
                }
                value /= 2;
                stack.pop();
            } else if(str.charAt(i) == ']') {
                if(stack.empty()){
                    System.out.println(0);
                    return;
                } else {
                    if (str.charAt(i-1) == '[') {
                        result += value;
                    } else {
                        if (stack.peek() != '['){
                            System.out.println(0);
                            return;
                        }
                    }
                }
                value /= 3;
                stack.pop();
            }
        }
        if(stack.size() > 0){
            System.out.println(0);
            return;
        }
        System.out.println(result);
    }
}

풀이

1. 올바른 괄호열의 확인

올바른 괄호열이 라는 것은 (), [] 처럼 완벽한 형태의 괄호이거나 올바른 괄호들을 포함하고 있는 경우

  • 이는 스택을 이용했을 때 (, [ 인 경우는 적재, ), ]인 경우는 스택 최상위에서 반대 짝을 없애는 행위를 통해 결론적으로 올바른 괄호열인지 판단할 수 있다
  • 스택을 이용해 오른쪽으로 열린 경우만 적재, 그 외는 스택 상태로 판단
    • 비어있거나 peek가 짝이 아니라면 올바르지 않은 괄호열

2. 괄호열 계산

우리가 직접 계산할 때 () or [] 처럼 직접 마주보고 있는 지점부터 계산하는 것처럼 코드도 마찬가지

  • 이를 위해 분배 법칙 적용
  • 분배 법칙을 이용할 때 이전 형태와 현재 형태가 (), [] 형태로 합쳐지는 경우에만 결과값에 추가해주면 된다

'Algorithm' 카테고리의 다른 글

[백준] 14719  (0) 2023.08.29
[백준] 14891  (0) 2023.08.29
[백준] 5430  (0) 2023.08.29
[백준] 16927  (0) 2023.08.29
[백준] 1790  (0) 2023.08.29

댓글