본문 바로가기
코딩테스트

C언어, C++ ] 프로그래머스 Lv. 2 - 올바른 괄호

by eteo 2023. 3. 25.

 

 

문제 설명

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어

  • "()()" 또는 "(())()" 는 올바른 괄호입니다.
  • ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.

'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

제한사항
  • 문자열 s의 길이 : 100,000 이하의 자연수
  • 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

 

입출력 예
s answer
"()()" true
"(())()" true
")()(" false
"(()(" false

입출력 예 설명

입출력 예 #1,2,3,4
문제의 예시와 같습니다.

 

 

 

 

 

C언어

 

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

bool solution(const char* s) {
    int len = strlen(s);
    int count = 0;

    for (int i = 0; i < len; i++) {
        if (s[i] == '(') {
            count++;
        } else if (s[i] == ')') {
            count--;
        }

        if (count < 0) {
            return false;
        }
    }

    return (count == 0);
}

 

strlen(s)만큼 반복

'(' 이면 count++

')' 이면 count--

count가 0보다 작아지면 ')' 가 '(' 전에 나온 경우이므로 즉시 false 리턴

마지막에 count ==0 이면 순서도 맞고, '('와 ')'의 개수도 동일하다는 뜻이므로 true 리턴

 

 

 

 

C++, stack 자료구조 사용해 푸는 방법

 

#include<string>
#include<iostream>
#include<stack>

using namespace std;

bool solution(string s)
{
    stack<char> st;

    for(char& c : s)
    {
        if(c=='(')
        {
            st.push(c);
        }
        else if(c==')')
        {
            if(st.empty())
            {
                return false;
            }
            else
            {
                st.pop();
            }
        }
    }
 
    return st.empty();
}

 

 

stack을 쓰기위에 표준 라이브러리인 stack 헤더 포함

'('이면 push하고

')'이면, stack이 비어있는 경우 false 리턴하고 아니면 stack에 들어있던거 pop함

마지막에 stack이 비어있으면 true