[백준] 균형잡힌 세상 - C++
문제 풀게된 계기
엊그제 풀던 문제 마저 풀기 ㅎㅎ
다 풀고 제출했어야하지만 코딩테스트와 최종면접 후에 풀어져가는
나의 마음가짐을 다시 잡기 ㅠㅠ
SV 코테 붙었음 좋겠다 ㅠ_ㅠ 면접 보고 시퍼여 ㅠㅠ
가고 시퍼요 o̴̶̷᷄﹏o̴̶̷̥᷅
문제 해결 방법
문제는 해당 문자열이 있을 경우
() 소괄호와 [] 대괄호가 있을 때 균형이 잡혀야하고,
괄호 안의 문자열마저도 균형이 잡혀야 한다.
이 방법을 나는 stack을 사용해서 풀었다.
저번에 비슷한 괄호 문제에서는 괄호의 갯수에 맞게 했는데
stack을 사용하여 괄호의 균형이 맞는지 보면 되기때문에 사용한다!
방법
-
제일 먼저 getline()을 사용해서 개행문자까지 받는다.
-
받은 문자열을 length()만큼 for문을 사용해서 조건에 따라 stack에 Push or pop
-
( or [를 만나면 push
-
) or ]를 만나게 되면 stack이 비어있지 않고 닫는 괄호에 맞게 ( 나 [가 스택의 top에 있으면 pop
-
그렇지 않은경우 result 결과를 NO로 하여 최종 결과에 반영
근데 문제를 풀면서 겪은 것은
20퍼에서 계속 틀렸습니다가 떴다.
그래서 왜 그런지 모든 반례를 다 햇는데도 뭔가 했는데
역시 컴퓨터는 거짓말을 하지 않음..
문제는 for문을 length()만큼 다 돌고 나오면
yes or no에 맞게 출력하는 부분에서
나는 모든 문자의 마지막은 "."으로 끝나야하는줄 알고
if (str[str.length()-1] != '.') result = "no";
cout << result << endl;
입력 문자열의 마지막이 "."이 아니면 no를 출력하게 끔 구성했다.
그치만 .는 입력값을 끝낸다는 의미였을 뿐
그래서 다시 수정해서
if (!s.empty() || result == "no") cout << "no" << endl;
else cout << "yes" << endl;
stack이 비어있지 않거나 결과가 no라면 no를 출력하고
그렇지 않은 경우 yes를 출력하게 했다.
그렇게 맞았습니다를 얻을 수 있게되었다.
코드
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main(void){
while(1){
string str;
getline(cin, str);
if (str.empty() || str == ".") break;
stack<char> s;
string result = "yes";
for (int i = 0; i < str.length(); ++i){
if (str[i] == '(') s.push(str[i]);
else if (str[i] == '[') s.push(str[i]);
else if (str[i] == ')'){
if (!s.empty() && s.top() == '(') s.pop();
else{
result = "no";
break;
}
}
else if (str[i] == ']'){
if (!s.empty() && s.top() == '[') s.pop();
else{
result = "no";
break;
}
}
}
if (!s.empty() || result == "no") cout << "no" << endl;
else cout << "yes" << endl;
}
}
Author And Source
이 문제에 관하여([백준] 균형잡힌 세상 - C++), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@u_jinju/백준-균형잡힌-세상-C저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)