Processing math: 100%

이 문제는 사실 군대에서 한 번 풀었었던 문제다. 스택에 여는 괄호는 무조건 push, 닫는 괄호가 나올 때 top과 짝이 맞으면 넘어가고 짝이 맞지 않거나 스택이 비었으면 no를 출력하는 간단한 문제다.

 

 다만 군대에서 풀었을 때 TLE가 발생했는데 그 이유는 초기화의 문제였다. 이 문제는 C++로 풀었는데, 만약 C로 풀었다면 그냥 top = -1을 대입하면 빠르게 초기화할 수 있었겠지만 stl을 사용하다보니 초기화 방법이 다음과 같이 할 수밖에 없었다.

void init() {
if(s.empty()) return;
while(!s.empty()) s.pop();
}

그런데 정말 간단한 방법을 찾았다.

 

"."이 입력될 때까지 무한루프고, 어차피 한 줄씩 입력받으면서 바로 결과값을 출력한다면 그냥 매 루프마다 스택을 새로 선언하면 되지 않을까?

 

#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
while(1) {
string temp;
getline(cin, temp);
if(temp.length() && temp[0] == '.') break;
stack<char> s;
bool res = true;
for(int i = 0; i < temp.length(); i++) {
if(temp[i] == '(' || temp[i] == '[')
s.push(temp[i]);
else if(temp[i] == ')') {
if(!s.empty() && s.top() == '(') s.pop();
else {
res = false;
break;
}
} else if(temp[i] == ']') {
if(!s.empty() && s.top() == '[') s.pop();
else {
res = false;
break;
}
}
}
if(res && s.empty()) cout << "yes\n";
else cout << "no\n";
}
return 0;
}

그 결과는 성공이였다.

 

'PS' 카테고리의 다른 글

[BOJ] 25501 재귀의 귀재  0 2023.02.13
[BOJ] 1094 막대기  0 2023.02.12
[BOJ] 1013 Contact  0 2023.02.09
[BOJ] 1541 잃어버린 괄호  0 2023.01.29
[BOJ] 1920 수 찾기  0 2023.01.16

+ Recent posts