[C++] ๊ด„ํ˜ธ

minpa
|2024. 3. 26. 17:46

๐ŸŸ
๋ฌธ์ œ ์‚ฌ์ดํŠธ: ๋ฐฑ์ค€
๋ฌธ์ œ ๋‚œ์ด๋„: Silver IV
๋ฌธ์ œ ๋ฒˆํ˜ธ: 9012

 

๐Ÿšฉ ๋ฌธ์ œ

๊ด„ํ˜ธ ๋ฌธ์ž์—ด(Parenthesis String, PS)์€ ๋‘ ๊ฐœ์˜ ๊ด„ํ˜ธ ๊ธฐํ˜ธ์ธ ‘(’ ์™€ ‘)’ ๋งŒ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ž์—ด์ด๋‹ค. ๊ทธ์ค‘์—์„œ ๊ด„ํ˜ธ์˜ ๋ชจ์–‘์ด ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋œ ๋ฌธ์ž์—ด์„ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด(Valid PS, VPS)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ํ•œ ์Œ์˜ ๊ด„ํ˜ธ ๊ธฐํ˜ธ๋กœ ๋œ “( )” ๋ฌธ์ž์—ด์€ ๊ธฐ๋ณธ VPS์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๋งŒ์ผ x ๊ฐ€ VPS ๋ผ๋ฉด ์ด๊ฒƒ์„ ํ•˜๋‚˜์˜ ๊ด„ํ˜ธ์— ๋„ฃ์€ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด “(x)”๋„ VPS ๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘ VPS x ์™€ y๋ฅผ ์ ‘ํ•ฉ(concatenation)์‹œํ‚จ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด xy๋„ VPS ๊ฐ€ ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด “(())()”์™€ “((()))” ๋Š” VPS ์ด์ง€๋งŒ “(()(”, “(())()))” , ๊ทธ๋ฆฌ๊ณ  “(()” ๋Š” ๋ชจ๋‘ VPS ๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž์—ด์ด๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์€ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด VPS ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ํŒ๋‹จํ•ด์„œ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ YES ์™€ NO ๋กœ ๋‚˜ํƒ€๋‚ด์–ด์•ผ ํ•œ๋‹ค.

 

์ž…๋ ฅ: ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋Š” ํ‘œ์ค€ ์ž…๋ ฅ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ž…๋ ฅ์€ T๊ฐœ์˜ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ž…๋ ฅ์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์˜ ์ฒซ์งธ ์ค„์—๋Š” ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด ํ•œ ์ค„์— ์ฃผ์–ด์ง„๋‹ค. ํ•˜๋‚˜์˜ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋Š” 2 ์ด์ƒ 50 ์ดํ•˜์ด๋‹ค.

 

์ถœ๋ ฅ: ์ถœ๋ ฅ์€ ํ‘œ์ค€ ์ถœ๋ ฅ์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋งŒ์ผ ์ž…๋ ฅ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด(VPS)์ด๋ฉด “YES”, ์•„๋‹ˆ๋ฉด “NO”๋ฅผ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฐจ๋ก€๋Œ€๋กœ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค.

 

์˜ˆ์ œ ์ž…๋ ฅ:

6
(())())
(((()())()
(()())((()))
((()()(()))(((())))()
()()()()(()()())()
(()((())()(

 

์˜ˆ์ œ ์ถœ๋ ฅ:

NO
NO
YES
NO
YES
NO

 

โš™๏ธ ์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <string>

using namespace std;

string isVPS(const string& ps){
    stack<char> stk;
    
    // ๋ฐ›์•„์˜จ ps ๋ฌธ์ž์—ด ์ˆœํšŒ
    for(char ch : ps){
    	if(ch == '('){
            stk.push(ch);
        }
        
        // ')' ์ด๋ฉด
        else{
            // ์Šคํƒ ๋น„์–ด์žˆ์œผ๋ฉด
            if(stk.empty()){
            	return "NO";
            }
            stk.pop();
        }
    }
    
    // ๋ชจ๋“  ๋ฌธ์ž์—ด ์ˆœํšŒ ์™„๋ฃŒ ํ›„ ๋‚จ์€ ๊ฒŒ ์žˆ์œผ๋ฉด NO, ์—†์œผ๋ฉด YES
    return stk.empty() ? "YES" : "NO";

}


int main(){
    int T;
    cin >> T;
    cin.ignore(); // cin ์ดํ›„ ์—”ํ„ฐ๊ฐ€ getline๊ณผ ๋งŒ๋‚˜๋ฉด ์ข…๋ฃŒ๋˜๋ฏ€๋กœ ํ•ญ์ƒ ignore์„ ํ•ด์•ผ ํ•จ
    
    while(T--){
    	string ps;
        getline(cin, ps);
        cout << isVPS(ps) <<"\n";
    }
    return 0;
}

๋ฉ”๋ชจ๋ฆฌ: 2024 KB, ์‹œ๊ฐ„: 4 ms

 

 

๐Ÿค” ์ฝ”๋“œ ํ’€์ด

์Šคํƒ์„ ์ด์šฉํ•œ๋‹ค. ์Šคํƒ์€ ๊ฐ€์žฅ ์ฒ˜์Œ์— ๋„ฃ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ ๋‚˜์ค‘์— ๋น ์ง€๋Š” FILO(First-In-Last_Out) ํŠน์ง•๊ณผ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ๋น ์ง€๋Š” LIFO(Last-In-First-Out) ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. 

 

1. ๋จผ์ € T๊ฐœ์˜ ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.

2. ๋ฌธ์ž์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ ์Šคํƒ์— ๋„ฃ๊ณ  ๋บ€๋‹ค.

  • ์—ฌ๋Š” ๊ด„ํ˜ธ์ผ ๊ฒฝ์šฐ ์Šคํƒ์— push ํ•œ๋‹ค.
  • ๋‹ซ๋Š” ๊ด„ํ˜ธ์ผ ๊ฒฝ์šฐ 
    • ์Šคํƒ์ด ๋น„์–ด์žˆ์œผ๋ฉด ์ง์ด ์—†์œผ๋ฏ€๋กœ ์˜ฌ๋ฐ”๋ฅธ VPS๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ NO
    • ์Šคํƒ์ด ๋น„์–ด์žˆ์ง€ ์•Š์œผ๋ฉด ์Šคํƒ์„ pop ํ•œ๋‹ค. '(' ์™€ ')' ์ด ์ง์„ ๋งบ๊ฒŒ ๋œ๋‹ค.

3. ๋ฌธ์ž์—ด ์ˆœํšŒ๊ฐ€ ๋๋‚œ ํ›„ ์ตœ์ข…์ ์œผ๋กœ ์Šคํƒ์ด ๋น„์–ด์žˆ์œผ๋ฉด ์—ฌ๋Š” ๊ด„ํ˜ธ๊ฐ€ ๋ชจ๋‘ ์ง์ด ๋งบ์–ด์ง„ ์˜ฌ๋ฐ”๋ฅธ VPS๋ผ๋Š” ๋œป์ด๋ฏ€๋กœ YES ์•„๋‹ˆ๋ฉด NO

 

โฑ๏ธ ์ฝ”๋“œ ์‹œ๊ฐ„ ๋ณต์žก๋„

์ฝ”๋“œ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(TN) ์ด๋‹ค.

 

์ˆœํšŒ ์—ฐ์‚ฐ: 

isVPS ํ•จ์ˆ˜๋Š” ๋ฃจํ”„๋ฅผ ํ†ตํ•ด ๋ฌธ์ž์—ด์˜ ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ์ˆœํšŒํ•œ๋‹ค. 

๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ n์ด๋ผ๊ณ  ํ•˜๋ฉด, ๋ฌธ์ž์—ด ์ˆœํšŒ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n)์ด๋‹ค.

 

์Šคํƒ ์—ฐ์‚ฐ: 

  • ์—ฌ๋Š” ๊ด„ํ˜ธ๋ฅผ ๋งŒ๋‚  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋˜๋Š” ์Šคํƒ์˜ push์—ฐ์‚ฐ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(1)์ด๋‹ค.
  • ๋‹ซ๋Š” ๊ด„ํ˜ธ๊ฐ€ ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋˜๋Š” ์Šคํƒ์˜ pop์—ฐ์‚ฐ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(1)์ด๋‹ค.
  • ์Šคํƒ์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” empty์—ฐ์‚ฐ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(1)์ด๋‹ค.

main ํ•จ์ˆ˜์—์„œ T์˜ ๊ฐœ์ˆ˜๋งŒํผ isVPS ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

isVPS ํ•จ์ˆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n)์ด๋ฏ€๋กœ, ๊ฐ ๋ฌธ์ž์—ด ๊ธธ์ด์˜ ํ•ฉ์„ N์ด๋ผ๊ณ  ํ•˜๋ฉด ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(TN)์ด๋‹ค.

 

โœจ ์ถ”๊ฐ€ ๊ณต๋ถ€

1. 

cin์„ ์ด์šฉํ•˜์—ฌ ์ •์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›์œผ๋ฉด ๋งˆ์ง€๋ง‰์— ์—”ํ„ฐ๋กœ ์ธํ•ด '\n' ๋ฌธ์ž๊ฐ€ ๋‚จ๊ฒŒ ๋œ๋‹ค. 

์ด ๋ฌธ์ž๊ฐ€ getlineํ•จ์ˆ˜์™€ ๋งŒ๋‚˜๊ฒŒ ๋˜๋ฉด ์ž…๋ ฅ์„ ์ข…๋ฃŒํ•œ๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ณ  ๋น„์–ด์žˆ๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ cin ์ดํ›„  cin.ignore()์„ ์ด์šฉํ•˜์—ฌ ๊ฐœํ–‰๋ฌธ์ž๋ฅผ ์ง€์›Œ์ค˜์•ผ ํ•œ๋‹ค.

 

2. 

getline ํ•จ์ˆ˜๋Š” C++ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ํ•œ ์ค„์˜ ํ…์ŠคํŠธ๋ฅผ ์ฝ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

๊ณต๋ฐฑ์„ ํฌํ•จํ•œ ํ•œ ์ค„ ์ „์ฒด๋ฅผ ์ฝ์–ด ๋“ค์ผ ์ˆ˜ ์žˆ์–ด, ๊ณต๋ฐฑ์ด ํฌํ•จ๋œ ํ…์ŠคํŠธ ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

์ž…๋ ฅ์„ ๋ฐ›๊ธฐ ์ „ cin.ignore()์„ ์ด์šฉํ•˜์—ฌ ๊ฐœํ–‰๋ฌธ์ž๋ฅผ ์ง€์›Œ์ค˜์•ผ ํ•œ๋‹ค.

 

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•:

std::string line;
std::getline(std::cin, line);

์ž…๋ ฅ ์ŠคํŠธ๋ฆผ cin๊ณผ ์ž…๋ ฅํ•  ํ…์ŠคํŠธ๋ฅผ ์ €์žฅํ•  string ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

'\n' ๊ฐœํ–‰๋ฌธ์ž ๊ธฐ์ค€์œผ๋กœ ๋ฌธ์ž์—ด์„ ์ฝ๋Š”๋‹ค.

 

๊ตฌ๋ถ„์ž ์‘์šฉ ์‚ฌ์šฉ๋ฒ•:

std::string line;
char delimiter = ',';
std::getline(std::cin, line, delimiter);

 

','๋ฅผ ๊ตฌ๋ถ„์ž๋กœ ์ด์šฉํ•˜์—ฌ ์ž…๋ ฅ์„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

์‰ผํ‘œ๋ฅผ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ์—”ํ„ฐ ํ‚ค๋ฅผ ๋ˆ„๋ฅผ ๋•Œ๊นŒ์ง€ ์ž…๋ ฅ๋œ ๋ชจ๋“  ๋ฌธ์ž๋ฅผ line์— ์ €์žฅํ•œ๋‹ค.