안녕하세요 Mismatched Brackets 관련 질문드립니다.

  • 종크크
    종크크

    안녕하세요 너무 당연한 걸 여쭤보는게 아닐까 걱정되지만, 도저히 생각이 안나서 여기에 여쭤봅니다...
    BRACKETS2 문제를 여러 방식으로 풀어보던 중에, 주어진 예제나 생각나는 다른 경우를 다 대입해보았는데, 왜 오답인지 알수가 없어서요... 코드는 다음과 같습니다.

    #include <stdio.h>
    #include <string.h>
    int main(void){
      int num_trials, i, j, k;
      char in[10000], c;
      char op[3] = {'(','{','['};
      char cl[3] = {')','}',']'};
      scanf("%d", &num_trials);
      while(num_trials--){
        scanf("%s", in);
        for(i=0,k=0;i<strlen(in);i++){
          for(j=0;j<3;j++){
            if(in[i]==op[j]) in[k]=j+1;
            if(in[i]==cl[j])
              if(i!=0&&in[k-1]==j+1) k -= 2;
          }
          k++;
        }
        k == 0 ? printf("YES\n") : printf("NO\n");
      }
    }
    

    위와 같은 코드인데, 제가 실력이 부족해서 어느 부분에서 오답처리가 되는지 잘 모르겠습니다... 도와주시면 정말 감사드리겟습니다!


    1년 전
5개의 댓글이 있습니다.
  • keith
    keith

    주석이라도 달아주셨으면 소스를 차분히 읽으며 설명을 드릴 수 있을텐데, 없다보니, 일단 그냥 훑어보고 답변드려서, 제가 틀릴 수 있습니다.
    FIFO(선입선출)에 대한 개념만 아시면 상당히 간단한 문제인데,
    풀어가신 방법을 보면 for문만이 존재합니다.
    직접적으로 스택을 구현 또는 사용하거나, 간접적으로 재귀함수를 활용해야 풀 수 있는 문제입니다.
    접근 자체가 잘못된거 같습니다.


    1년 전 link
  • keith
    keith

    추가적으로, in 배열 사이즈는 [10001]이 되어야 합니다. (문자열은 마지막에 '\0'이 들어갑니다.)
    다행히도, c라는 변수가 추가로 스택영역에 존재해서..(안쓰이는거 같은데..) Access Violation 런타임 에러는 안나긴 할겁니다. 하지만, 버릇이 되면 위험할 수 있습니다.


    1년 전 link
  • 종크크
    종크크

    아 감사합니다. 제가 주석을 달았어야 했는데,,,그 점 죄송합니다ㅜㅜ... 스택 구현이나 재귀함수를 한번 공부해봐야겟네요. 제가 너무 근본이 없던 차라 아주 큰 도움이 되었습니다. 배열 사이즈에 대한 코멘트도 감사드립니다. 한 번 다시 해보겠습니다!


    1년 전 link
  • keith
    keith

    위에 제가 댓글을 잘못적어서 정정합니다.
    FIFO(선입선출) 이 아니라, LIFO(후입선출) 입니다. ^^
    보니 푸신거 같은데, 정답 소스를 보니, 감각적으로 스택을 구현하셨더군요. ^^


    1년 전 link
  • 종크크
    종크크

    아 LIFO이군요! 아직 많이 부족해서 많이 노력해야할 듯 합니다 ㅠㅠ 도움 주셔서 감사합니다!


    1년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.