작성
·
140
0
http://boj.kr/8d65e8a10d10408285809b81032c7b17
안녕하세요 강사님. 좋은 수업 잘 듣고 있습니다.
제가 이 코드에서 처럼 sort에 사용되는 cmp를 정의했는데, 제 컴퓨터에서는 잘 돌아가는데 boj에서는 runtime error(segmentation fault)가 발생합니다. 그래서 cmp를 이렇게 바꾸면
bool cmp(pair<int, int> p1, pair<int, int> p2) {
if (p1.second == p2.second) return p1.first < p2.first;
return p1.second < p2.second;
}
잘 돌아갑니다. 왜 첨부한 링크의 cmp처럼 코드를 쓰면 segmentation fault가 발생하는지 궁금합니다. 감사합니다.
답변 1
0
안녕하세요 mu님ㅎㅎ
bool cmp(pair<int, int> p1, pair<int, int> p2) {
return p1.second <= p2.second;
}
이 코드의 주된 문제는 비교 함수 cmp
가 정렬 기준을 명확히 하지 않는다는 것입니다. 특히, std::sort
와 같은 정렬 함수에서 사용되는 비교 함수는 '엄격한 약한 순서(strict weak ordering)'를 만족해야 합니다.
이는 비교 연산이 반사성(reflexivity), 비대칭성(antisymmetry), 추이성(transitivity) 그리고 비교 불가능한 요소들 간의 추이성을 만족해야 함을 의미합니다.
주어진 코드에서 return p1.second <= p2.second;
는 두 요소가 같을 때 true
를 반환합니다. 이것은 정렬 알고리즘이 '같음'을 '작거나 같음'으로 해석하도록 하여, 두 요소가 동일할 때 이들을 서로 바꿔도 되는 것처럼 처리할 수 있게 합니다. 그러나 이는 비대칭성 조건을 위반할 수 있으며, 정렬 알고리즘에 따라서는 예기치 않은 동작을 유발할 수 있습니다.
올바른 비교 함수는 두 요소가 동일하지 않을 때만 true
를 반환하도록 해야 합니다. 즉, '작다'의 조건을 만족할 때만 true
를 반환해야 하며, '같거나 작다'가 아니라 '엄격히 작다(strictly less than)'의 조건을 사용해야 합니다.
즉, <= 이렇게 쓰일 수 없습니다.
bool cmp(const pair<int, int>& p1, const pair<int, int>& p2) {
return p1.second < p2.second;
}
이런식으로 수정하셔야 합니다. 😄econd < p2
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.