• toc {:toc}

문제

μ—¬λŸ¬ 개의 μ‡ λ§‰λŒ€κΈ°λ₯Ό λ ˆμ΄μ €λ‘œ μ ˆλ‹¨ν•˜λ €κ³  ν•œλ‹€. 효율적인 μž‘μ—…μ„ μœ„ν•΄μ„œ μ‡ λ§‰λŒ€κΈ°λ₯Ό μ•„λž˜μ—μ„œ μœ„λ‘œ 겹쳐 놓고, λ ˆμ΄μ €λ₯Ό μœ„μ—μ„œ 수직으둜 λ°œμ‚¬ν•˜μ—¬ μ‡ λ§‰λŒ€κΈ°λ“€μ„ 자λ₯Έλ‹€. μ‡ λ§‰λŒ€κΈ°μ™€ λ ˆμ΄μ €μ˜ λ°°μΉ˜λŠ” λ‹€μŒ 쑰건을 λ§Œμ‘±ν•œλ‹€.

  • μ‡ λ§‰λŒ€κΈ°λŠ” μžμ‹ λ³΄λ‹€ κΈ΄ μ‡ λ§‰λŒ€κΈ° μœ„μ—λ§Œ 놓일 수 μžˆλ‹€. - μ‡ λ§‰λŒ€κΈ°λ₯Ό λ‹€λ₯Έ μ‡ λ§‰λŒ€κΈ° μœ„μ— λ†“λŠ” 경우 μ™„μ „νžˆ ν¬ν•¨λ˜λ„λ‘ λ†“λ˜, 끝점은 κ²ΉμΉ˜μ§€ μ•Šλ„λ‘ λ†“λŠ”λ‹€.
  • 각 μ‡ λ§‰λŒ€κΈ°λ₯Ό 자λ₯΄λŠ” λ ˆμ΄μ €λŠ” 적어도 ν•˜λ‚˜ μ‘΄μž¬ν•œλ‹€.
  • λ ˆμ΄μ €λŠ” μ–΄λ–€ μ‡ λ§‰λŒ€κΈ°μ˜ μ–‘ 끝점과도 κ²ΉμΉ˜μ§€ μ•ŠλŠ”λ‹€.

μ•„λž˜ 그림은 μœ„ 쑰건을 λ§Œμ‘±ν•˜λŠ” 예λ₯Ό 보여쀀닀. μˆ˜ν‰μœΌλ‘œ κ·Έλ €μ§„ ꡡ은 싀선은 μ‡ λ§‰λŒ€κΈ°μ΄κ³ , 점은 λ ˆμ΄μ €μ˜ μœ„μΉ˜, 수직으둜 κ·Έλ €μ§„ 점선 ν™”μ‚΄ν‘œλŠ” λ ˆμ΄μ €μ˜ λ°œμ‚¬ λ°©ν–₯이닀.

iron-stick

μ΄λŸ¬ν•œ λ ˆμ΄μ €μ™€ μ‡ λ§‰λŒ€κΈ°μ˜ λ°°μΉ˜λŠ” λ‹€μŒκ³Ό 같이 κ΄„ν˜Έλ₯Ό μ΄μš©ν•˜μ—¬ μ™Όμͺ½λΆ€ν„° μˆœμ„œλŒ€λ‘œ ν‘œν˜„ν•  수 μžˆλ‹€.

  1. λ ˆμ΄μ €λŠ” μ—¬λŠ” κ΄„ν˜Έμ™€ λ‹«λŠ” κ΄„ν˜Έμ˜ μΈμ ‘ν•œ 쌍 β€˜( ) ’ 으둜 ν‘œν˜„λœλ‹€. λ˜ν•œ, λͺ¨λ“  β€˜( ) β€™λŠ” λ°˜λ“œμ‹œ λ ˆμ΄μ €λ₯Ό ν‘œν˜„ν•œλ‹€.
  2. μ‡ λ§‰λŒ€κΈ°μ˜ μ™Όμͺ½ 끝은 μ—¬λŠ” κ΄„ν˜Έ β€˜ ( ’ 둜, 였λ₯Έμͺ½ 끝은 λ‹«νžŒ κ΄„ν˜Έ β€˜) ’ 둜 ν‘œν˜„λœλ‹€.

μœ„ 예의 κ΄„ν˜Έ ν‘œν˜„μ€ κ·Έλ¦Ό μœ„μ— μ£Όμ–΄μ Έ μžˆλ‹€.

μ‡ λ§‰λŒ€κΈ°λŠ” λ ˆμ΄μ €μ— μ˜ν•΄ λͺ‡ 개의 쑰각으둜 μž˜λ €μ§€λŠ”λ°, μœ„ μ˜ˆμ—μ„œ κ°€μž₯ μœ„μ— μžˆλŠ” 두 개의 μ‡ λ§‰λŒ€κΈ°λŠ” 각각 3κ°œμ™€ 2개의 쑰각으둜 μž˜λ €μ§€κ³ , 이와 같은 λ°©μ‹μœΌλ‘œ μ£Όμ–΄μ§„ μ‡ λ§‰λŒ€κΈ°λ“€μ€ 총 17개의 쑰각으둜 μž˜λ €μ§„λ‹€.

μ‡ λ§‰λŒ€κΈ°μ™€ λ ˆμ΄μ €μ˜ 배치λ₯Ό λ‚˜νƒ€λ‚΄λŠ” κ΄„ν˜Έ ν‘œν˜„μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ, μž˜λ €μ§„ μ‡ λ§‰λŒ€κΈ° 쑰각의 총 개수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

ν•œ 쀄에 μ‡ λ§‰λŒ€κΈ°μ™€ λ ˆμ΄μ €μ˜ 배치λ₯Ό λ‚˜νƒ€λ‚΄λŠ” κ΄„ν˜Έ ν‘œν˜„μ΄ 곡백없이 μ£Όμ–΄μ§„λ‹€. κ΄„ν˜Έ 문자의 κ°œμˆ˜λŠ” μ΅œλŒ€ 100,000이닀.

좜λ ₯

μž˜λ €μ§„ 쑰각의 총 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜λ₯Ό ν•œ 쀄에 좜λ ₯ν•œλ‹€.

좜처: https://www.acmicpc.net/problem/10799

풀이

κ·œμΉ™μ„ 찾으렀고 λ…Έλ ₯ν–ˆμŒ. (κ°€ μΆ”κ°€ 될 λ•Œ λ§ˆλ‹€ μŠ€νƒμ— μΆ”κ°€λ˜κ³  )κ°€ 좔가됨에 따라 μ•ž κΈ€μžκ°€ ( 냐 λ˜λŠ” ) 냐에 따라 λ³€ν™”λ₯Ό μ€˜μ•Ό 함을 κΉ¨λ‹¬μŒ. λ‹€λ§Œ 개수 처리λ₯Ό ν•˜λŠ” 뢀뢄에 μžˆμ–΄μ„œ κ³„μ†ν•΄μ„œ 개수λ₯Ό μ€‘λ³΅ν•΄μ„œ μΉ΄μš΄νŠΈν–ˆλ˜ 뢀뢄이 λ¬Έμ œμ˜€λ˜ 것 κ°™μŒ.

*λ ˆμ΄μ €λ‘œ μ ˆλ‹¨ν•˜μ—¬ 2개둜, μ–‘μͺ½μœΌλ‘œ λ‚˜λˆ„λŠ” κ²½μš°μ—λŠ” λ ˆμ΄μ €λ‘œ λ‚˜λˆ μ§„ 뢀뢄을 ν•œμͺ½μœΌλ‘œλ§Œ μƒκ°ν•΄μ„œ 카운트 ν•΄λ³΄μž. (λ‚˜μ€‘μ— 잘 이해λͺ»ν•  것 같은데…)

경우λ₯Ό 잘 λ‚˜λˆ λ³΄μž

#include <bits/stdc++.h>
using namespace std;
 
int res = 0;
stack<int> s;
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    string str;
    cin >> str;
    for(int i=0; i<str.size(); i++){
        cout << res << endl;
        if(str[i] == '('){
            s.push(str[i]);
        }
        else{           // str[i] == ')' 일 λ•Œ 
            if(str[i-1] == '('){        // 레이져일 λ•Œ
                s.pop(); 
                res += s.size();
            }
            else{                       // λ§‰λŒ€κΈ°μ˜ 끝일 λ•Œ
                s.pop();
                res += 1;
            }
        }
    }
 
    cout << res << endl;
 
    return 0;
}