본문 바로가기
[백준]

[BaekJoon/백준] 9012번 스택 활용

by Hevton 2021. 3. 5.
반응형

VPS 라는 문자열 조건을 체크하는 문제.

상쇄 조건을 체크하는 문제다.

 

 

첫 번째로, 그냥 풀어보았다!

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

char str[51]; // 하나는 널문자 여유.. ㅎㅎ
int N;

int main() {
    int value = 0; // 항상 0보다 크거나 같음을 유지하면서 반복문을 돌아야함.
    scanf("%d", &N);

    for(int i = 0; i < N; i++) {

        value = 0;
        scanf("%s", str);

        for(int j = 0; j < strlen(str); j++) {

            if(value < 0)
                break;

            if(str[j] == '(')
                value++;
            if(str[j] == ')')
                value--;


        }
        if(value == 0)
            printf("YES\n");
        else
            printf("NO\n");
    }
}

/*
 앞에서 나온 ( 갯수와, 따라 나오는 ) 의 갯수는 서로 상충되는 관계다.

 
 앞에서 ( 가 나온만큼 )가 나와야 VPS가 된다.
 그래서 value 변수를 두고, ( 일시 ++, ( 일시 -- 를 통해 value 변수값을 조절한다.
 
 반복문 내에서 value 변수가 0보다 작은 경우가 되면, 앞에서 (가 나온 만큼 뒤에서 )가 나오지 않은 상황이므로 바로 반복문을 종료한다.
 
 그리고 반복문이 끝났을 때, value == 0이면 둘의 상쇄가 잘 이루어진 것이므로 YES, 그게 아니라면(0보다 크거나 0보다 작거나) 상쇄가 잘 이루어지지 않은 것이므로 NO.
 
 */

스택을 쓰지 않고도 나름 기발하게 생각해내서 풀었다고 느껴서 정말 뿌듯했다!!!

 

 

근데 이걸 스택으로도 풀 수 있다고 하는데 도저히 모르겠어서, 다른 분의 풀이를 참고했는데, 놀라웠다.. 난 이런생각을 하질 못했다.

알고 나니 간단한 것만 같은데, 난 생각을 못했다..

 

여튼 그렇게해서 스택으로도 다시풀어보았다.

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

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

void push(IntStack *s, int a) {
    s->stack[s->size++] = a;
}
int pop(IntStack *s) {
    if(s->size <= 0)
        return -1; // 데이터 없을 시 -1
    
    --s->size;
    
    return 0; // 성공 시 0
}

int N;
char input[51];

int main() {
    int i, j;
    IntStack st;
    st.stack = calloc(51, sizeof(int));
    st.size = 0;
    
    scanf("%d", &N);
    
    for(i = 0; i < N; i++) {
        
        st.size = 0; // 매번 초기화
        scanf("%s", input);
        
        for(j = 0; j < strlen(input); j++) {
            if(input[j] == '(') {
                push(&st, 1);
            }
            else if(input[j] == ')') {
                if(pop(&st) == 0)
                    ;
                else
                    break;
            }
        }
        // 배열을 끝까지 안 돈 경우 = 중간에 break or 상쇄가 되지 않은 경우
        if( j != strlen(input) || st.size != 0)
            printf("NO\n");
        else
            printf("YES\n");
    
    }
    
}

 

반응형

'[백준]' 카테고리의 다른 글

[BaekJoon/백준] 1874번 스택 활용  (0) 2021.03.06
[BaekJoon/백준] 4949 스택 활용  (0) 2021.03.06
[BaekJoon/백준] 10773번 스택  (0) 2021.03.05
[BaekJoon/백준] 10828 스택 구현  (0) 2021.03.05
[BaekJoon/백준] 2004번  (0) 2021.03.04