πŸ• Baaaaaarking/0x08κ°• - μŠ€νƒμ˜ ν™œμš© (μˆ˜μ‹μ˜ κ΄„ν˜ΈμŒ)

[BOJ S2][C++] 2504번: κ΄„ν˜Έμ˜ κ°’

선달 2022. 3. 6. 03:24
λ°˜μ‘ν˜•

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

 

2504번: κ΄„ν˜Έμ˜ κ°’

4개의 기호 β€˜(’, β€˜)’, β€˜[’, β€˜]’λ₯Ό μ΄μš©ν•΄μ„œ λ§Œλ“€μ–΄μ§€λŠ” κ΄„ν˜Έμ—΄ μ€‘μ—μ„œ μ˜¬λ°”λ₯Έ κ΄„ν˜Έμ—΄μ΄λž€ λ‹€μŒκ³Ό 같이 μ •μ˜λœλ‹€. ν•œ 쌍의 κ΄„ν˜Έλ‘œλ§Œ 이루어진 β€˜()’와 β€˜[]β€™λŠ” μ˜¬λ°”λ₯Έ κ΄„ν˜Έμ—΄μ΄λ‹€.  만일

www.acmicpc.net

 

문제

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을 좜λ ₯ν•΄μ•Ό ν•œλ‹€. 

 

풀이

(1)

μš°μ„  κ΄„ν˜Έκ°€ μ œλŒ€λ‘œ λ˜μ–΄μžˆλŠ”κ°€λ₯Ό νŒλ‹¨ν•΄μ„œ μ•„λ‹κ²½μš° 0이 λ˜λ„λ‘ λ§Œλ“ λ‹€

[πŸ• Baaaaaarking/0x08κ°• - μŠ€νƒμ˜ ν™œμš© (μˆ˜μ‹μ˜ κ΄„ν˜ΈμŒ)] - [BOJ S4][C++] λ°±μ€€ 9012번: κ΄„ν˜Έ

ν•„μš”ν•˜λ‹€λ©΄ μ°Έκ³ 

 

(2)

λ³Έ λ¬Έμ œλŠ” "뢄배법칙"을 λ™μ‹œμ— ν•˜λ©΄μ„œ ν‘ΈλŠ” 문제라고 μƒκ°ν•˜λ©΄ νŽΈν•˜λ‹€

κ΄„ν˜Έκ°€ μ—΄λ¦΄λ•Œλ§ˆλ‹€ κ·Έ μ•ˆμ˜ μš”μ†Œλ“€μ— κ³±ν•΄μ§ˆ 것을 미리 mul μ΄λΌλŠ” λ³€μˆ˜μ— κ³±ν•΄λ‘λŠ”κ²ƒμ΄λ‹€

 

(3)

κ΄„ν˜Έκ°€ λ‹«νžˆλ©΄ 

1. μ›λž˜ λ°”λ‘œ μ•žμ— 짝이 있던 경우 -> μƒμˆ˜ (2λ‚˜ 3) 인 κ²½μš°μ΄λ―€λ‘œ mul에 있던 κ³Ό κ³±ν•΄μ Έμ„œ ans 에 더해짐

2. 1이 μ•„λ‹Œκ²½μš° -> μš”μ†Œλ₯Ό ν¬ν•¨ν•˜κ³  μžˆλŠ” κ΄„ν˜Έμ΄λ―€λ‘œ κ·Έλƒ₯ μ–Œμ „νžˆ λ‹«νžŒλ‹€

( mul에 본인 짝이 μ—΄λ¦¬λ©΄μ„œ 곱해놓은 뢀뢄을 λ‚˜λˆ„κΈ°λ‘œ μƒμ‡„μ‹œν‚€λ©΄μ„œ μ–Œμ „νžˆ λ– λ‚˜κΈ° (pop) )

 

// Authored by : seondal
// Co-authored by : -

//#include <bits/stdc++.h>
#include <iostream>
#include <stack>

using namespace std;

int ans;
stack<char> s;

int main() {
    
    int ans = 0;
    int mul = 1;
    
    string input;
    cin >> input;
    
    for(int i=0; i<input.size(); i++){
        if(input[i] == '(') {
        // (2)
            mul *= 2;
            s.push('(');
        }
        else if(input[i] == ')') {
            if(s.empty() || s.top() != '(') {
            // (1)
                cout << 0;
                return 0;
            }
            
            // (3)
            if(input[i-1] == '(') {
                mul /= 2;
                s.pop();
                ans += mul*2;
            } else {
                mul /= 2;
                s.pop();
            }
        }
        else if(input[i] == '[') {
        // (2)
            mul *= 3;
            s.push('[');
        }
        else if(input[i] == ']') {
            if(s.empty() || s.top() != '[') {
            // (1)
                cout << 0;
                return 0;
            }
            
            // (3)
            if(input[i-1] == '[') {
                mul /= 3;
                s.pop();
                ans += mul*3;
            } else {
                mul /= 3;
                s.pop();
            }
        }
    }
    
    // (1)
    if(s.empty()) cout << ans;
    else cout << 0;
    
    return 0;
}
/*
 */
λ°˜μ‘ν˜•