๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜

[Java] BOJ 2504 ๊ด„ํ˜ธ์˜ ๊ฐ’

by ๐ŸŠ๊ทค๐ŸŠ 2024. 12. 16.

๋ฌธ์ œ 

๋ฌธ์ œ ๋งํฌ https://www.acmicpc.net/problem/2504

  • 4๊ฐœ์˜ ๊ธฐํ˜ธ ‘(’, ‘)’, ‘[’, ‘]’๋ฅผ ์ด์šฉํ•ด์„œ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ด„ํ˜ธ์—ด ์ค‘์—์„œ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์—ด์ด๋ž€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋œ๋‹ค.
    • ํ•œ ์Œ์˜ ๊ด„ํ˜ธ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ‘()’์™€ ‘[]’๋Š” ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์—ด์ด๋‹ค.
    • ๋งŒ์ผ X๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์—ด์ด๋ฉด ‘(X)’์ด๋‚˜ ‘[X]’๋„ ๋ชจ๋‘ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์—ด์ด ๋œ๋‹ค.
    • X์™€ Y ๋ชจ๋‘ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์—ด์ด๋ผ๋ฉด ์ด๋“ค์„ ๊ฒฐํ•ฉํ•œ XY๋„ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์—ด์ด ๋œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด ‘(()[[]])’๋‚˜ ‘(())[][]’ ๋Š” ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์—ด์ด์ง€๋งŒ ‘([)]’ ๋‚˜ ‘(()()[]’ ์€ ๋ชจ๋‘ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์—ด์ด ์•„๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์–ด๋–ค ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์—ด X์— ๋Œ€ํ•˜์—ฌ ๊ทธ ๊ด„ํ˜ธ์—ด์˜ ๊ฐ’(๊ด„ํ˜ธ๊ฐ’)์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ •์˜ํ•˜๊ณ  ๊ฐ’(X)๋กœ ํ‘œ์‹œํ•œ๋‹ค.
    • ‘()’ ์ธ ๊ด„ํ˜ธ์—ด์˜ ๊ฐ’์€ 2์ด๋‹ค.
    • ‘[]’ ์ธ ๊ด„ํ˜ธ์—ด์˜ ๊ฐ’์€ 3์ด๋‹ค.
    • ‘(X)’ ์˜ ๊ด„ํ˜ธ๊ฐ’์€ 2×๊ฐ’(X) ์œผ๋กœ ๊ณ„์‚ฐ๋œ๋‹ค.
    • ‘[X]’ ์˜ ๊ด„ํ˜ธ๊ฐ’์€ 3×๊ฐ’(X) ์œผ๋กœ ๊ณ„์‚ฐ๋œ๋‹ค.
    • ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์—ด X์™€ Y๊ฐ€ ๊ฒฐํ•ฉ๋œ XY์˜ ๊ด„ํ˜ธ๊ฐ’์€ ๊ฐ’(XY)= ๊ฐ’(X)+๊ฐ’(Y) ๋กœ ๊ณ„์‚ฐ๋œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด ‘(()[[]])([])’ ์˜ ๊ด„ํ˜ธ๊ฐ’์„ ๊ตฌํ•ด๋ณด์ž. ‘()[[]]’ ์˜ ๊ด„ํ˜ธ๊ฐ’์ด 2 + 3×3=11 ์ด๋ฏ€๋กœ ‘(()[[]])’์˜ ๊ด„ํ˜ธ๊ฐ’์€ 2×11=22 ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ‘([])’์˜ ๊ฐ’์€ 2×3=6 ์ด๋ฏ€๋กœ ์ „์ฒด ๊ด„ํ˜ธ์—ด์˜ ๊ฐ’์€ 22 + 6 = 28 ์ด๋‹ค.
  • ์—ฌ๋Ÿฌ๋ถ„์ด ํ’€์–ด์•ผ ํ•  ๋ฌธ์ œ๋Š” ์ฃผ์–ด์ง„ ๊ด„ํ˜ธ์—ด์„ ์ฝ๊ณ  ๊ทธ ๊ด„ํ˜ธ๊ฐ’์„ ์•ž์—์„œ ์ •์˜ํ•œ๋Œ€๋กœ ๊ณ„์‚ฐํ•˜์—ฌ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ์ฒซ์งธ ์ค„์— ๊ด„ํ˜ธ์—ด์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด(์ŠคํŠธ๋ง)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹จ ๊ทธ ๊ธธ์ด๋Š” 1 ์ด์ƒ, 30 ์ดํ•˜์ด๋‹ค.
  • ์ฒซ์งธ ์ค„์— ๊ทธ ๊ด„ํ˜ธ์—ด์˜ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์ผ ์ž…๋ ฅ์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ๋ชปํ•œ ๊ด„ํ˜ธ์—ด์ด๋ฉด ๋ฐ˜๋“œ์‹œ 0์„ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค.

์•„์ด๋””์–ด

  • stack์„ ํ™œ์šฉํ•˜์—ฌ ๊ณ„์‚ฐํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค.
  • '('๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ์ค‘๊ฐ„ ๊ณ„์‚ฐ๊ฐ’์— 2๋ฅผ ๊ณฑํ•˜๊ณ  '['๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ์ค‘๊ฐ„ ๊ณ„์‚ฐ๊ฐ’์— 3์„ ๊ณฑํ•œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ')'๊ฐ€ ๋“ค์–ด์™”์„ ๋•Œ, stack์ด ๋น„์–ด์žˆ๊ฑฐ๋‚˜ stack์˜ ๋งจ ์œ„ ๊ฐ’์ด '('์ด ์•„๋‹ˆ๋ผ๋ฉด ๊ด„ํ˜ธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์—ฐ๊ฒฐ์ด ๋˜์–ด์žˆ์ง€ ์•Š์•˜๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ ๊ฒฐ๊ณผ๊ฐ’์„ 0์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๋ฐ˜๋ณต๋ฌธ์„ ํƒˆ์ถœํ•œ๋‹ค.
  • ๋งŒ์•ฝ i - 1๋ฒˆ์งธ ๊ฐ’์ด '('์ด๋ผ๋ฉด, ๊ฒฐ๊ณผ๊ฐ’์— ์ค‘๊ฐ„ ๊ณ„์‚ฐ๊ฐ’์„ ๋”ํ•˜๊ณ  stack์˜ ๋งจ ์œ„ ๊ฐ’์„ ๋บ€ ๋’ค, ์ค‘๊ฐ„ ๊ณ„์‚ฐ๊ฐ’์„ 2๋กœ ๋‚˜๋ˆˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ']'๊ฐ€ ๋“ค์–ด์™”์„ ๋•Œ, stack์ด ๋น„์—ˆ๊ฑฐ๋‚˜ stack์˜ ๋งจ ์œ„ ๊ฐ’์ด '['์ด ์•„๋‹ˆ๋ผ๋ฉด ๊ด„ํ˜ธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์—ฐ๊ฒฐ์ด ๋˜์–ด์žˆ์ง€ ์•Š๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ ๊ฒฐ๊ณผ๊ฐ’์„ 0์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๋ฐ˜๋ณต๋ฌธ์„ ํƒˆ์ถœํ•œ๋‹ค.
  • ๋งŒ์•ฝ i - 1๋ฒˆ์งธ ๊ฐ’์ด '['์ด๋ผ๋ฉด, ๊ฒฐ๊ณผ๊ฐ’์— ์ค‘๊ฐ„ ๊ณ„์‚ฐ๊ฐ’์„ ๋”ํ•˜๊ณ  stack์˜ ๋งจ ์œ„ ๊ฐ’์„ ๋บ€ ๋’ค, ์ค‘๊ฐ„ ๊ณ„์‚ฐ๊ฐ’์„ 3์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค.
  • ๋ฐ˜๋ณต๋ฌธ์„ ๋‹ค ๋Œ๊ณ  stack์ด ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด, ๊ด„ํ˜ธ์˜ ์ˆœ์„œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ 0์„ ์ถœ๋ ฅํ•˜๊ณ  ๋น„์–ด์žˆ๋‹ค๋ฉด ๊ฒฐ๊ณผ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค. 

๊ฒช์€ ์‹œํ–‰์ฐฉ์˜ค

  • ์ฒ˜์Œ์— stack ๋Œ€์‹  ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์‚ฐ์„ ํ•˜๋ ค๊ณ  ํ•˜์˜€์ง€๋งŒ ์ƒ๊ฐ์ฒ˜๋Ÿผ ์ž˜ ๋˜์ง€ ์•Š์•˜๋‹ค...
  • ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ฐพ๋А๋ผ ์ข€ ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค ใ…œใ…œ

stack์„ ์˜ค๋žœ๋งŒ์— ์‚ฌ์šฉํ•˜๋‹ˆ ์ข€ ์˜ค๋ž˜๊ฑธ๋ ธ๋˜ ๊ฒƒ ๊ฐ™๋‹ค...ใ…œใ…œ ์ต์ˆ™ํ•ด์ง€์ž..!!

์ฝ”๋“œ

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

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

        // ๋ฌธ์ž์—ด ์ž…๋ ฅ
        String s = br.readLine();

        // ๊ด„ํ˜ธ๋ฅผ ์ €์žฅํ•  stack
        Stack<Character> cal = new Stack<>();

        // ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์‚ฐํ•  ๋ณ€์ˆ˜
        int result = 0;
        // ์ค‘๊ฐ„์— ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ์ €์žฅํ•  ๋ณ€์ˆ˜
        int mid = 1;

        for(int i = 0; i < s.length(); i++){
            char c = s.charAt(i);

            // ๋งŒ์•ฝ ๋ฌธ์ž๊ฐ€ '('๋ผ๋ฉด ์†Œ๊ด„ํ˜ธ๊ฐ€ ์—ด๋ฆฌ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ
            // stack์— ( ๋ฅผ ๋„ฃ๊ณ , ()๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ
            // ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๊ฐ’์— 2๋ฅผ ๊ณฑํ•จ -> ex - (())์ด๋ฉด 2 * 2์ด๋ฏ€๋กœ
            if(c == '('){
                cal.push(c);

                mid = mid * 2;
            }
            // ๋ฌธ์ž๊ฐ€ ')'์ด๋ผ๋ฉด ์†Œ๊ด‹ํ˜ธ๊ฐ€ ๋‹ซํžˆ๋Š” ๊ฒƒ
            else if(c == ')'){
                // ๋งŒ์•ฝ stack์ด ๋น„์–ด์žˆ๋‹ค๋ฉด ๊ด„ํ˜ธ์˜ ์ˆœ์„œ๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค๋Š” ๋œป์ด๊ณ 
                // stack์˜ ๋งจ ์œ„์— ์žˆ๋Š” ๊ฐ’์ด '('์ด ์•„๋‹Œ ๊ฒƒ๋„ ๊ด„ํ˜ธ์˜ ์ˆœ์„œ๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค๋Š”
                // ๋œป์ด๋ฏ€๋กœ ๊ฒฐ๊ณผ๊ฐ’์„ 0์œผ๋กœ ๋ฐ”๊พธ๊ณ  ๋ฐ˜๋ณต๋ฌธ ํƒˆ์ถœ
                if(cal.isEmpty() || cal.peek() != '('){
                    result = 0;
                    break;
                }

                // ๋งŒ์•ฝ i - 1๊ฐ’์ด '('์ด๋ผ๋ฉด
                if(s.charAt(i - 1) == '('){
                    // ์†Œ๊ด„ํ˜ธ๊ฐ€ ์™„์„ฑ ๋˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ
                    // ์ค‘๊ฐ„์— ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ’์— ๋”ํ•จ
                    // ex) - ()()์ผ ๊ฒฝ์šฐ, 2 + 2์ด๋ฏ€๋กœ
                    result = result + mid;
                }

                // ๊ทธ๋ฆฌ๊ณ  stack์—์„œ ๋งจ ์œ„์˜ ๊ฐ’์„ ๋นผ๋‚ธ ๋’ค,
                cal.pop();
                // ์ค‘๊ฐ„ ๊ณ„์‚ฐ๊ฐ’์—์„œ 2 ๋‚˜๋ˆˆ ๊ฐ’์„ ์ค‘๊ฐ„ ๊ณ„์‚ฐ๊ฐ’์„
                // ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜์— ๋‹ค์‹œ ์ €์žฅ
                mid = mid / 2;
            }
            // ๋งŒ์•ฝ ๋ฌธ์ž๊ฐ€ '['๋ผ๋ฉด ๋Œ€๊ด„ํ˜ธ๊ฐ€ ์—ด๋ฆฌ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ
            // stack์— [ ๋ฅผ ๋„ฃ๊ณ , []๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ
            // ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๊ฐ’์— 3์„ ๊ณฑํ•จ -> ex - [[]]์ด๋ฉด 3 * 3์ด๋ฏ€๋กœ
            else if(c == '['){
                cal.push(c);

                mid = mid * 3;
            }
            // ๋ฌธ์ž๊ฐ€ ']'์ด๋ผ๋ฉด ๋Œ€๊ด„ํ˜ธ๊ฐ€ ๋‹ซํžˆ๋Š” ๊ฒƒ
            else if(c == ']'){
                // ๋งŒ์•ฝ stack์ด ๋น„์–ด์žˆ๋‹ค๋ฉด ๊ด„ํ˜ธ์˜ ์ˆœ์„œ๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค๋Š” ๋œป์ด๊ณ 
                // stack์˜ ๋งจ ์œ„์— ์žˆ๋Š” ๊ฐ’์ด '['์ด ์•„๋‹Œ ๊ฒƒ๋„ ๊ด„ํ˜ธ์˜ ์ˆœ์„œ๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค๋Š”
                // ๋œป์ด๋ฏ€๋กœ ๊ฒฐ๊ณผ๊ฐ’์„ 0์œผ๋กœ ๋ฐ”๊พธ๊ณ  ๋ฐ˜๋ณต๋ฌธ ํƒˆ์ถœ
                if(cal.isEmpty() || cal.peek() != '['){
                    result = 0;
                    break;
                }

                // ๋งŒ์•ฝ i - 1๊ฐ’์ด '['์ด๋ผ๋ฉด
                if(s.charAt(i - 1) == '['){
                    // ์†Œ๊ด„ํ˜ธ๊ฐ€ ์™„์„ฑ ๋˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ
                    // ์ค‘๊ฐ„์— ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ’์— ๋”ํ•จ
                    // ex) - [][]์ผ ๊ฒฝ์šฐ, 3 + 3์ด๋ฏ€๋กœ
                    result = result + mid;
                }

                // ๊ทธ๋ฆฌ๊ณ  stack์—์„œ ๋งจ ์œ„์˜ ๊ฐ’์„ ๋นผ๋‚ธ ๋’ค,
                cal.pop();
                // ์ค‘๊ฐ„ ๊ณ„์‚ฐ๊ฐ’์—์„œ 3 ๋‚˜๋ˆˆ ๊ฐ’์„ ์ค‘๊ฐ„ ๊ณ„์‚ฐ๊ฐ’์„
                // ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜์— ๋‹ค์‹œ ์ €์žฅ
                mid = mid / 3;
            }
        }

        // ๋งŒ์•ฝ stack์ด ๋ชจ๋‘ ๋น„์—ˆ๋‹ค๋ฉด ๋ชจ๋“  ๊ด„ํ˜ธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์—ฐ๊ฒฐ๋˜์—ˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ
        // ๊ฒฐ๊ณผ๊ฐ’์„ ์ถœ๋ ฅ
        if(cal.isEmpty()){
            System.out.println(result);
        }
        // ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด ๊ด„ํ˜ธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด์žˆ์ง€ ์•Š์•˜๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ
        // 0์„ ์ถœ๋ ฅ
        else{
            System.out.println(0);
        }
    }
}