Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

zyeon's 작심삼일 코딩 공부

프로그래머스 C++ [올바른 괄호] 본문

코딩테스트-프로그래머스/Lv.2

프로그래머스 C++ [올바른 괄호]

젼뀨 2024. 6. 8. 19:34

문제 설명

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

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

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


제한사항

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

입출력 예

s answer
"()()" true
"(())()" true
")()(" false
"(()(" false

문제 풀이

 

1. 맨 앞에 '('가 온다.

2.맨 뒤에 ')'가 온다.

3. '('와 ')'의 개수가 같다. 

이 문제를 처음 봤을 때 내가 고려한 것들이다.

bool solution(string s)
{
    bool answer = false;

    int c1 = 0, c2 = 0;
    for(int i = 0; i<s.size(); i++){
        if(s[i] == '(') c1++;
        else c2++;
    }
    
    if(s.front() == '(' && s.back() == ')'&& c1 == c2) answer = true;
    
    return answer;
}

따라서 위처럼 코드를 작성했는데, 몇 가지 결과가 틀렸다고 나왔다.

위 코드는 "())(()"와 같은 문자열도 true를 리턴하는 것이었다.

 

그래서 '('일 때는 카운트를 증가시켜주고, ')'일 때는 카운트를 감소시켜주는 방법을 사용했다.

이러면 카운트가 음수로 내려갈 때 예외가 걸러진다.

#include<string>
#include <iostream>

bool solution(string s)
{
    bool answer = true;

    int c = 0;
    
    for(int i = 0; i<s.size(); i++){
        if(s[i] == '(') c++;
        else c--;
        
        if(c < 0) {
            answer = false; 
            break;
        }
    }
    if(c != 0) answer = false;
    
    return answer;
}

 

같은 방식으로 stack을 사용해 풀 수도 있다.

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

bool solution(string s)
{
    bool answer = true;
    stack<char> stack_s;
    
    for(auto& c : s){
        if(c == '(') stack_s.push(c);
        else { 
            if(stack_s.empty()) {
                answer = false;
                break;
            }
            stack_s.pop();
        }
    }
    if(!stack_s.empty()) answer = false;
    
    return answer;
}

 

 

 

 

 

출처: 프로그래머스 코딩 테스트 연습, 

https://school.programmers.co.kr/learn/challenges