Baekjoon 9012 VPS

배혜진·2023년 1월 11일


이 문제는 괄호문자열이 올바른지 아닌지를 판별하는 문제이다.


어쩌다 이렇게까지 틀렸는지에 대해 적어보겠다..

처음 문제를 읽을 때, 지난 데이터구조 시간에 배운 parenthesis matching을 생각했다. 그래서 괄호가 맞기만하면 yes를 출력하고, 남거나 부족하면 no를 출력하는 방식으로 코드를 짰다.

#include <iostream>
#include <cstring>
#include <stack>
using namespace std;

int main (void){
    int T;
    cin>>T;

    char s[50];
    for(int i=0; i<T; i++){
        stack<char> S;
        cin>>s;
        string cmd;
        for (int j=0; j<strlen(s);j++){
            if(s[j]=='('){
                S.push(j);
            }
            if(s[j]==')'){
                if(S.empty()){
                    cmd="NO";
                    break;
                }
                else{
                    S.pop();
                }
            }
            if(S.empty()){
                cmd="YES";
            }
            else {
                cmd="NO";
            }
        }
        cout<<cmd<<endl;
    }
    return 0;
}

하지만 이 코드에서

이런 에러가 떴다. strlen과 j의 자료형이 달라 경고를 보낸 것 같았다.
그래서 이를 수정했다.

#include <iostream>
#include <cstring>
#include <stack>
using namespace std;

int main (void){
    int T;
    cin>>T;

    for(int i=0; i<T; i++){
        char s[50]={};
        stack<char> S;
        cin>>s;
        int len=strlen(s);
        if(len>=2){
        string cmd;
        for (int j=0; j<len;j++){
            if(s[j]=='('){
                S.push(j);
            }
            else if(s[j]==')'){
                if(S.empty()){
                    cmd="NO";
                    break;
                }
                else{
                    S.pop();
                }
            }
            if(S.empty()){
                cmd="YES";
            }
            else {
                cmd="NO";
            }
        }
        cout<<cmd<<endl;
 }   }
    return 0;
}

하지만 그냥 틀려버렸다.

분명히 test case도 잘 실행돼는데, 왜 자꾸 틀렸습니다가 뜨는지 도통 모르겠어서
조금씩 코드를 수정하며 여러번 제출을 시도했지만 결과는 마찬가지였다.

#include <iostream>
#include <cstring>
#include <stack>
using namespace std;

int main (void){
    int T;
    cin>>T;

    for(int i=0; i<T; i++){
        char s[50]={};
        stack<char> S;
        cin>>s;
        int idx=1;

        int len=strlen(s);
        
        if(len>=2){

        string cmd;

        for (int j=0; j<len;j++){
            if(s[0]!='(') {
                cmd="NO";
                idx=0;
                break;
            }
            if(s[j]=='('){
                S.push(j);
            }
            else if(s[j]==')'){
                if(S.empty()){
                    cmd="NO";
                    idx=0;
                    break;
                }
                else{
                    S.pop();
                }
            }
        }

        if(idx){
            if(S.empty()){
                cmd="YES";
            }
            else {
                cmd="NO";
            }
     
        }    
        cout<<cmd<<endl;  
        }
    }
    return 0;
}

이렇게 인덱스를 넣어주면 어떨까 싶어 시도해보기도했다.

아무리 풀어도 안풀려서 문제가 원하는 것이 내가 이해한바와 다른것 같다는 생각에
문제를 다시 읽어보았고, VPS에 대해서 인터넷 검색을 해보았다.
결론은 내가 문제를 잘못 이해한 것이었다.

괄호문자열으로, '('와 ')'만으로 이루어진다고 하였기에 중간에 괄호가 아닌 다른 문자가 들어가면 안되는것이다!!!
그래서 다시 코드를 수정해 제출했다.

#include <cstring>
#include <iostream>
#include <stack>
using namespace std;

int main(void) {
  int T;
  cin >> T;

  for (int i = 0; i < T; i++) {
    string s;
    stack<char> S;
    cin >> s;

    if (s.length() >= 2) {

      string cmd = "YES";

      for (int j = 0; j < s.length(); j++) {

        if (s[j] == '(') {
          S.push(s[j]);
        } else if (s[j] == ')') {
          if (!S.empty()) {
            S.pop();
          } else {
            cmd = "NO";
            break;
          }
        } else {
          cmd = "NO";
          break;
        }
      }

      if (!S.empty()) {
        cmd = "NO";
      }

      cout << cmd << endl;
    }
  }
  return 0;
}

이것이 최종 코드이다.

그래도 이제 스택을 어느정도 쓰는 방법을 익힌 것 같고, 앞으로는 문제를 꼼꼼히 읽어서 요구사항을 정확하게 파악해야겠다.

그래도 실버문제를 풀어서 뿌듯하다

profile
HYU🦁 Information System 22✨

0개의 댓글