๐
๋ฌธ์ ์ฌ์ดํธ: ๋ฐฑ์ค
๋ฌธ์ ๋์ด๋: 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์ ์ ์ฅํ๋ค.
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++] ์ฝ๋ฉํ ์คํธ ์๊ฐ์ด๊ณผ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ตฌ๋ฌธ๋ค (0) | 2024.06.11 |
---|---|
[C++] ์ซ์์ ํฉ (0) | 2024.03.28 |
[C++] ์นด๋2 (0) | 2024.03.27 |
[C++] ์์ธํธ์ค ๋ฌธ์ 0 (1) | 2024.03.25 |
[C++] ๋ถ์์ ๋ง์ (0) | 2024.03.09 |