๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โœจ Algorithm

[๋ฐฑ์ค€/C++] 2504๋ฒˆ: ๊ด„ํ˜ธ์˜ ๊ฐ’

by nitronium102 2022. 7. 31.

๋ฌธ์ œ

4๊ฐœ์˜ ๊ธฐํ˜ธ ‘(’, ‘)’, ‘[’, ‘]’๋ฅผ ์ด์šฉํ•ด์„œ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ด„ํ˜ธ์—ด ์ค‘์—์„œ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์—ด์ด๋ž€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋œ๋‹ค.

  1. ํ•œ ์Œ์˜ ๊ด„ํ˜ธ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ‘()’์™€ ‘[]’๋Š” ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์—ด์ด๋‹ค. 
  2. ๋งŒ์ผ X๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์—ด์ด๋ฉด ‘(X)’์ด๋‚˜ ‘[X]’๋„ ๋ชจ๋‘ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์—ด์ด ๋œ๋‹ค. 
  3. X์™€ Y ๋ชจ๋‘ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์—ด์ด๋ผ๋ฉด ์ด๋“ค์„ ๊ฒฐํ•ฉํ•œ XY๋„ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์—ด์ด ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ‘(()[[]])’๋‚˜ ‘(())[][]’ ๋Š” ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์—ด์ด์ง€๋งŒ ‘([)]’ ๋‚˜ ‘(()()[]’ ์€ ๋ชจ๋‘ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์—ด์ด ์•„๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์–ด๋–ค ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์—ด X์— ๋Œ€ํ•˜์—ฌ ๊ทธ ๊ด„ํ˜ธ์—ด์˜ ๊ฐ’(๊ด„ํ˜ธ๊ฐ’)์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ •์˜ํ•˜๊ณ  ๊ฐ’(X)๋กœ ํ‘œ์‹œํ•œ๋‹ค. 

  1. ‘()’ ์ธ ๊ด„ํ˜ธ์—ด์˜ ๊ฐ’์€ 2์ด๋‹ค.
  2. ‘[]’ ์ธ ๊ด„ํ˜ธ์—ด์˜ ๊ฐ’์€ 3์ด๋‹ค.
  3. ‘(X)’ ์˜ ๊ด„ํ˜ธ๊ฐ’์€ 2×๊ฐ’(X) ์œผ๋กœ ๊ณ„์‚ฐ๋œ๋‹ค.
  4. ‘[X]’ ์˜ ๊ด„ํ˜ธ๊ฐ’์€ 3×๊ฐ’(X) ์œผ๋กœ ๊ณ„์‚ฐ๋œ๋‹ค.
  5. ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์—ด X์™€ Y๊ฐ€ ๊ฒฐํ•ฉ๋œ XY์˜ ๊ด„ํ˜ธ๊ฐ’์€ ๊ฐ’(XY)= ๊ฐ’(X)+๊ฐ’(Y) ๋กœ ๊ณ„์‚ฐ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ‘(()[[]])([])’ ์˜ ๊ด„ํ˜ธ๊ฐ’์„ ๊ตฌํ•ด๋ณด์ž. ‘()[[]]’ ์˜ ๊ด„ํ˜ธ๊ฐ’์ด 2 + 3×3=11 ์ด๋ฏ€๋กœ ‘(()[[]])’์˜ ๊ด„ํ˜ธ๊ฐ’์€ 2×11=22 ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ‘([])’์˜ ๊ฐ’์€ 2×3=6 ์ด๋ฏ€๋กœ ์ „์ฒด ๊ด„ํ˜ธ์—ด์˜ ๊ฐ’์€ 22 + 6 = 28 ์ด๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์ด ํ’€์–ด์•ผ ํ•  ๋ฌธ์ œ๋Š” ์ฃผ์–ด์ง„ ๊ด„ํ˜ธ์—ด์„ ์ฝ๊ณ  ๊ทธ ๊ด„ํ˜ธ๊ฐ’์„ ์•ž์—์„œ ์ •์˜ํ•œ๋Œ€๋กœ ๊ณ„์‚ฐํ•˜์—ฌ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๊ด„ํ˜ธ์—ด์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด(์ŠคํŠธ๋ง)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹จ ๊ทธ ๊ธธ์ด๋Š” 1 ์ด์ƒ, 30 ์ดํ•˜์ด๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๊ทธ ๊ด„ํ˜ธ์—ด์˜ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์ผ ์ž…๋ ฅ์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ๋ชปํ•œ ๊ด„ํ˜ธ์—ด์ด๋ฉด ๋ฐ˜๋“œ์‹œ 0์„ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. 

ํ’€์ด 

๋ถ„๋ฐฐ๋ฒ•์น™์„ ์ด์šฉํ•˜๋Š” ๋ฌธ์ œ! 

์šฐ์„  ์—ฌ๋Š” ๊ด„ํ˜ธ๊ฐ€ ๋‚˜์˜ค๋ฉด ๊ด„ํ˜ธ์˜ ๊ฐ’์„ ๊ณฑํ•ด์ฃผ๊ณ , ๋‹ซ๋Š” ๊ด„ํ˜ธ๋Š” ์ด์ „ ๋ฌธ์ž๊ฐ€ ์—ฌ๋Š” ๊ด„ํ˜ธ์ผ ๊ฒฝ์šฐ์—๋งŒ ์ง€๊ธˆ๊นŒ์ง€ ๊ณฑํ•œ ๊ฐ’์„ ๋”ํ•ด์ค€๋‹ค. ๋‹ซ๋Š” ๊ด„ํ˜ธ๊ฐ€ ๋‚˜์˜ค๋ฉด ํ•œ ๊ด„ํ˜ธ์— ๋Œ€ํ•œ ์—ฐ์‚ฐ์ด ๋๋‚ฌ์œผ๋ฏ€๋กœ ๋‹ค์‹œ ๊ด„ํ˜ธ๊ฐ’์„ ๋‚˜๋ˆ ์ค€ ํ›„ ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•œ๋‹ค.

#include <iostream>
#include <stack>
#include <map>

using namespace std;

/* [๋ถ„๋ฐฐ๋ฒ•์น™ ์ด์šฉ]
 * (()[[]]) = 2*(2+3*(3)) = 2*2 + 2*3*3
 * ( : 2๋ฐฐ
 * (( : 4๋ฐฐ
 * (([ : 4 ๋”ํ•ด์ฃผ๊ณ  ๋’ค์— ๊ฒƒ์€ 2๋ฐฐ(2๋กœ ๋‚˜๋ˆ„๊ธฐ)
 * (()[ : 6๋ฐฐ
 * (()[[ : 18๋ฐฐ
 * (()[[] : 18 ๋”ํ•ด์ฃผ๊ณ  ๋’ค์— ๊ฒƒ์€ 6๋ฐฐ(3์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ)
 * (()[[]] : ๊ฐ’์ด ๋‚˜์˜จ ๊ฒƒ์ด ์•„๋‹˜! []์ฒ˜๋Ÿผ ๋ฐ”๋กœ ์•ž ๋ฌธ์ž๊ฐ€ ์—ฌ๋Š” ๊ด„ํ˜ธ์ผ ๋•Œ๋งŒ ๊ฐ’์ด ๋‚˜์˜จ๋‹ค
 *           ๋’ค์— ๊ฒƒ๋“ค์€ 2๋ฐฐ(3์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ)
 * (()[[]]) : ๊ฐ’์ด ๋‚˜์˜จ ๊ฒƒ์ด ์•„๋‹˜! ๋’ค์— ๊ฒƒ๋“ค์€ 1๋ฐฐ(2๋กœ ๋‚˜๋ˆ„๊ธฐ)
 */
int calc(string s) {
    stack<char> st;
    map<char, int> num;
    map<char, char> bracket;

    // ๊ด„ํ˜ธ ์Œ๊ณผ ๊ฐ’ ์ €์žฅ
    num['('] = 2;
    num['['] = 3;
    bracket[')'] = '(';
    bracket[']'] = '[';

    int answer = 0;
    int tmp = 1;
    for (int i = 0; i < s.length(); i++) {
        char c = s[i];
        switch (c) {
            case '(':
            case '[': // ์—ฌ๋Š” ๊ด„ํ˜ธ : ์ผ๋‹จ ๊ณฑ์…ˆ
                st.push(c);
                tmp *= num[c];
                break;

            case ')':
            case ']': // ๋‹ซ๋Š” ๊ด„ํ˜ธ : tmp ๊ฐ’ ๋‚˜๋ˆ„๊ธฐ
                if (st.empty() || st.top() != bracket[c]) {
                    return 0;
                }
                if (s[i - 1] == bracket[c]) // ๋ฐ”๋กœ ์•ž ๋ฌธ์ž๊ฐ€ ์—ฌ๋Š” ๊ด„ํ˜ธ์ธ ๊ฒฝ์šฐ : ๋”ํ•ด์ค€๋‹ค
                    answer += tmp;
                tmp /= num[bracket[c]];
                st.pop();
                break;
        }
    }
    if (st.empty()) // ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์ธ ๊ฒฝ์šฐ
        return answer;
    return 0;
}

int main() {
    string s;
    cin >> s;

    cout << calc(s);
}

๋Œ“๊ธ€