알고리즘

자바 - 백준 2504 / 괄호의 값

kdozlo 2024. 12. 9. 00:35

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

골드5

구현 방법

조건에 만족하지 않는 경우는 크게 3가지가 존재한다.

1. 괄호 모양이 다른 경우

2. 여는 괄호가 더 많은 경우. (, [

3. 닫는 괄호가 더 많은 경우. ), ]

 

스택을 활용하여 문제를 해결했고, 아래 규칙을 반복적으로 수행했다.

1. 여는 괄호는 스택에 넣는다.

2. 닫는 괄호가 나오면 같은 모양의 여는 괄호가 나올 때까지 스택에서 꺼낸다. 이 때 나오는 숫자를 다 더해준다.

3-1. 더해진 숫자가 0인 경우, 가장 안쪽 괄호 쌍이므로 2나 3을 스택에 넣는다.

3-2. 더해진 숫자가 0이 아닌 경우, 해당 숫자에 2나 3을 곱한 뒤 스택에 넣는다.

3-3. 같은 모양이 아닌 경우, 0을 출력한다.

4. 1~3 반복 후, 스택에서 숫자를 꺼내 모두 더하면 답이다.

    하지만 숫자 외에 괄호가 나온다면 위의 '조건 2번에서 여는 괄호가 많은 경우' 이므로 0을 출력한다.

코드

import java.util.*;
import java.io.*;

/**
* 백준 2504
* 괄호의 값
* 골드5
* https://www.acmicpc.net/problem/2504
*/
public class Boj2504 {

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

        char[] cs = br.readLine().toCharArray();
        Stack<String> s = new Stack<>();
        boolean flag = false; // 괄호 짝이 다른 경우 false
        for(char c : cs) {

            if(c == '(' || c == '[') {
                s.add(c + "");
            } else if(c == ')'){
                int num = 0;
                flag = false;

                while(!s.isEmpty()) {
                    String temp = s.pop();

                    if(temp.equals("(")) {
                        flag = true; // 괄호 짝이 맞는 경우
                        break;
                    } else if(temp.equals("[")){
                        break;
                    } else {
                        num += Integer.parseInt(temp);
                    }
                }

                if(!flag) {
                    break;
                }

                num = num == 0 ? 2 : num * 2;
                s.add(num + "");
            } else if(c == ']'){
                int num = 0;
                flag = false;

                while(!s.isEmpty()) {
                    String temp = s.pop();

                    if(temp.equals("[")) {
                        flag = true;
                        break;
                    } else if(temp.equals("(")){
                        break;
                    } else {
                        num += Integer.parseInt(temp);
                    }
                }

                if(!flag) {
                    break;
                }

                num = num == 0 ? 3 : num * 3;
                s.add(num + "");
            }
        }

        int answer = 0;
        if(flag) {
            while(!s.isEmpty()) {
                String temp = s.pop();

                // 괄호가 남아 있는 경우
                if(temp.equals("(") || temp.equals("[")) {
                    answer = 0;
                    break;
                }
                answer += Integer.parseInt(temp);
            }
        }
        System.out.println(answer);
    }
}

'알고리즘' 카테고리의 다른 글

자바 - 백준 9252 / LCS 2  (2) 2024.12.21
자바 : 백준 2589 / 보물섬  (1) 2024.12.16
자바 - 백준 1101 / 카드 정리 1  (0) 2024.12.07
자바 - 백준 2098 / 외판원 순회  (0) 2024.12.05
자바 - 코드트리 / 빙산의 일각  (0) 2024.10.29