본문 바로가기
[백준]

[BaekJoon/백준] 4949 스택 활용

by Hevton 2021. 3. 6.
반응형

이전 괄호문제(9012번)에서 발전된 유형문제.

 

이전에 두가지 방법으로 풀었는데, 첫번째 풀이로는 어려울 듯 해서 두 번째 풀이로 진행했다.

 

보디사시피 많이 틀렸다.

정말 많이 틀렸다. 모든게 문제를 제대로 읽지 못한 것에서 비롯되었다.

 

내가 계속 캐치해내지 못했던 부분은.. 솔직히 말하면 좀 애매하다. 문제에서 조금 더 정확히 알려줬다면 좋았을 텐데.. 문제도 어느정도 잘못이 있다고 말하고 싶다 ㅜ

 

문자열을 입력받을 때, 최대 길이가 100이라고 안내해주었다. 그리고 문자열의 종료 조건으로 마지막에 . 을 넣어준다고 했다.

그러면 당연히 .이 포함된 문자열 최대 길이가 100인줄 알았는데 .는 별개였다.. 

 

즉, 입력받을 char 배열의 크기는 '문자열(100) + .(1) +  널문자(1) = 102 여야 한다.

 

 

어쨌든,, 이것만 주의하면 되고!! 문제를 풀어나가는 방향은 이전 9012번과 비슷하겠지만

소괄호와 중괄호를 구분하여 스택에 넣어주고 ( 저 같은 경우는 1과 2로 구분 )

pop 할때, top이 현재 pop하려는 괄호와 일치하는지 체크해나가면서

일치하면 pop, 일치하지 않으면 조건에 충족되지 않는 경우라고 보면 된다. 

 

왜냐하면

Help( I[m being held prisoner in a fortune cookie factory)].

경우, 둘의 짝이 맞아보이지만 ( [ ) ] 이므로, 짝이 맞지 않는게 사실이다.

 

 

코드

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    int *stk;
    int size;
}IntStack;

void push(IntStack *s, int a) {
    s->stk[s->size++] = a;
    
}

int pop(IntStack *s, int a) {
    
    // 같은 종류가 맨 위에 있다면
    if(a == s->stk[s->size - 1]) {
        s->size--;
        return 1; // 성공
    }
    
    return 0; // 실패
}
int N;
char str[102];

// 소괄호 1, 중괄호 2

int main() {
    int i;
    
    IntStack stack;
    stack.size = 0;
    stack.stk = calloc(102, sizeof(int));
    
    while(1) {
        
        fgets(str, 102, stdin);
        
        if(str[0] == '.') // 종료조건.
            return 0;
        
        
        stack.size = 0; // 매번 초기화
        
        for(i = 0; i < strlen(str); i++) {
            
            if(str[i] == '(') {
                push(&stack, 1);
            } else if(str[i] == ')') {
                if(pop(&stack, 1))
                    ;
                else // 짝이 안맞는다면
                    break;
            
            } else if(str[i] == '[') {
                push(&stack, 2);
            } else if(str[i] == ']') {
                if(pop(&stack, 2))
                    ;
                else
                    break;
            }
            
        }
        // 끝까지 안돌았거나, 스택에 무언가 들어있거나.
        if(strlen(str) != i || stack.size != 0)
            printf("no\n");
        else
            printf("yes\n");
        
        
    }
    
}
반응형