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

[BOJ S4][C++] 10799번: μ‡ λ§‰λŒ€κΈ°

선달 2022. 3. 6. 02:48
λ°˜μ‘ν˜•

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

 

10799번: μ‡ λ§‰λŒ€κΈ°

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

www.acmicpc.net

 

문제

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

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

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

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

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

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

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

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

μž…λ ₯

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

좜λ ₯

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

 

풀이

μ—΄λ¦° κ΄„ν˜ΈλŠ” 무쑰건 push

λ‹«νžŒ κ΄„ν˜Έμ΄λ©΄ ν•΄λ‹Ή κ΄„ν˜Έκ°€

 

(1) λ°”λ‘œ μ•žμ— μ—΄λ¦°κ΄„ν˜Έκ°€ μžˆλ‹€ -> λ ˆμ΄μ €

--> μ•žμ— μŒ“μΈ μ‡ λ§‰λŒ€κΈ° 개수만큼 갯수 μΆ”κ°€

 

(2) 1이 μ•„λ‹ˆλ‹€ -> μ‡ λ§‰λŒ€κΈ° 끝뢀뢄

--> λλ‚œ μ‡ λ§‰λŒ€κΈ° 쑰각 ν•˜λ‚˜λ§Œ μΆ”κ°€

 

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

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

using namespace std;

int ans;
stack<char> s;

int main() {
    
    string input;
    cin >> input;
    for(int i=0; i<input.size(); i++){
        if(input[i] == '(') // μ—΄λ¦° κ΄„ν˜Έ μΌλ•Œ
            s.push('(');
        else { // λ‹«νžŒ κ΄„ν˜Έ μΌλ•Œ
            if(input[i-1] == '(') { // λ ˆμ΄μ €μΈ 경우
                s.pop();
                ans += s.size();
            }
            else {  // λ§‰λŒ€κΈ°μ˜ 끝뢀뢄인 경우
                s.pop();
                ans++;
            }
        }
    }
    
    cout << ans;
    
    return 0;
}
/*
 */
λ°˜μ‘ν˜•