https://school.programmers.co.kr/learn/courses/30/lessons/12909

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

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


❗주의할점

  : 괄호 확인을 한 후 (for문을 빠져나오면) stack에 괄호가 남아있으면 false

  : stack의 top()을 사용할 때는 stack이 비어있는지 확인해야 한다.

 ✅ 사용한 자료구조 

 : stack을 사용해서 풀이 (stack 이나 queue , dequeue등의 자료구조를 사용해도 된다.)

 

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

using namespace std;

bool solution(string s)
{
    bool answer = true;
    
    stack<char> stack;
    for (int i = 0; i < s.length(); i++) 
    {
        // 0. 괄호 시작이면 ? -> 담아두기
        if (s[i] == '(')
            stack.push('(');

        // 1. 괄호 끝이면 ? 
        else if (s[i] == ')')
        {
            // stack 검사해서 맨 위에 '('가 있는지 ?
            if ( stack.size() != 0 && stack.top() == '(')
            {
                // stack에서 꺼내기
                stack.pop();
            }
            else
            {
                answer = false;
                break;
            }
        }
    }
    
    // 끝나고 stack이 비어있지 않으면 -> false
    if (stack.size() != 0)
        answer = false;

    return answer;
}

 

➕ 만약 stack의 top을 비교할 때 , stack.size() != 0 라고 체크를 안 해주면 테스트케이스 18번에서 (signal : segmentation fault ) 오류가 뜨게된다.

 

❓왜 오류가 나지 ?

 :  stack.top()함수는 stack의 가장 위에 있는 요소를 return 하는데, 비어있을 때 호출하면 '정의되지 않은 동작'이 발생할 수 있음 (=예외가 발생할 수 있음 ) 

 

❗조건 비교 순서도 중요하다 

: && 연산자는 '단락 평가'(sort - circuit evaluation)를 사용하기 때문이다. 

: 단락평가란 ?

▶️두개 이상의 논리 연산을 진행할 때 첫번째 값만으로 결과가 정해지면, 두번째 값은 평가 하지 않는다.

if ( stack.size() != 0 && stack.top() == '(')

: stack의 size가 0 이면, && 뒤의 조건은 평가 되지 않는다. 

if ( stack.top() == '(' && stack.size() != 0 )

: stack의 size를 검사하는 조건이 있음에도,  이 조건문은 예외가 발생할 수 있다. 


https://github.com/churush912837465

 

churush912837465 - Overview

churush912837465 has 4 repositories available. Follow their code on GitHub.

github.com

 

+ Recent posts