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
'프로그래머스' 카테고리의 다른 글
[C++][프로그래머스][Lv2] 42842. 카펫 (1) | 2024.07.18 |
---|---|
[C++][프로그래머스][Lv2] 12911. 다음 큰 숫자 (0) | 2024.07.11 |
[C++][프로그래머스][Lv2] 70129. 이진 변환 반복하기 (0) | 2024.07.08 |
[C++][프로그래머스][Lv2] 12951. JadenCase 문자열 만들기 (0) | 2024.07.08 |
[C++][프로그래머스][Lv2] 12939. 최댓값과 최솟값 (0) | 2024.07.02 |