관리 메뉴

한다 공부

[C++] segmentation fault (core dumped) : stack 본문

Dev/🤦‍♀️깨달음

[C++] segmentation fault (core dumped) : stack

사과당근 2022. 5. 27. 05:12

코딩테스트 연습 - 괄호 회전하기 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - 괄호 회전하기

 

programmers.co.kr

괄호 회전하기 문제를 풀다가

테스트 케이스는 다 통과를 했는데 제출 후 채점하니까

4개의 케이스를 제외하고 모두 segmentation fault (core dumped)가 났다.

 

segmentation fault (core dumped) 의 원인을 찾아보니까 잘못된 배열 인덱스 접근 등등이 문제라고 했다.

 

잘 생각해보니까 나는

if(st.top()!='{'||st.empty()){ 
	return false;
}

이런 식으로,

닫는 괄호 } 를 만났을 때

1. { 가 아닌 다른 괄호를 만나면 괄호 체크 false

2. 스택이 비어있으면 괄호 체크 false

 

라고 생각을 했다.

그런데 남아있는 스택이 아무것도 없을 때,

st.top 이 가릴킬 수 있는게 없기 때문에

위의 순서대로 조건문을 실행한다면 잘못된 접근이 될 가능성이 있다.

 

그래서 우선, 스택이 비어있는지 확인하는게 앞에 와야하고

스택이 비어있지 않다면 그때 top에 무엇이 있는지 확인하는 것이 옳다.

 

if(st.empty()||st.top()!='{'){ 
	return false;
}

위의 순서대로 체크하면 segmentation fault (core dumped) 가 발생하지 않는다.

 

전체적으로는 아래와 같이 풀었다.

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

using namespace std;

bool check(string s, int n){
    stack<char> st;
    for(int i=0; i<n; i++){
        if(s[i]=='{'||s[i]=='['||s[i]=='('){
            st.push(s[i]);
        }
        
        else if(s[i]=='}'){
            //or 순서가 바뀌면 segmentation fault (core dumped)
            if(st.empty()||st.top()!='{'){ 
                return false;
            }
            else st.pop();
        }
        
        else if(s[i]==']'){
            if(st.empty()||st.top()!='['){
                return false;
            }
            else st.pop();
        }
        
        else if(s[i]==')'){
            if(st.empty()||st.top()!='('){
                return false;
            }
            else st.pop();
        }
    }
    if(!st.empty())
            return false;
    return true;
}

int solution(string s) {
    int answer = 0;
    int n = s.size();
    for(int i=0; i<n; i++){
        string temp = "";
        temp+=s.substr(i,n-i);
        temp+=s.substr(0,i);
        if(check(temp, n))
            answer++;
    }
    return answer;
}

 

어쩐지 저번에도 같은 실수를 했던 것 같아서 익숙하게 수정했는데

원인을 떠올리는데에 은근 시간이 걸렸다.

 

같은 실수를 반복하지 않고자 하는 의미에서의 기록...... 💥

'Dev > 🤦‍♀️깨달음' 카테고리의 다른 글

[C++] cin.eof()  (0) 2022.10.04
[NGiNX] 413 Request Entity Too Large  (0) 2022.07.13
[C++] stable_sort  (0) 2022.02.26
[C++] 최단 경로, 다익스트라  (0) 2022.02.26