한다 공부
[C++] segmentation fault (core dumped) : stack 본문
코딩테스트 연습 - 괄호 회전하기 | 프로그래머스 (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 |