inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

5주차 개념 #3. 큰돌은 욕심많은 도서관 사서야!!!

sort에서 쓰는 cmp함수에 질문이 있습니다.

192

mu_

작성한 질문수 3

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가 발생하는지 궁금합니다. 감사합니다.

c++ 코딩-테스트

답변 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점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.


4-F 경우의 수 질문입니다.

0

22

2

코딩살구클럽 가입이 안됩니다.

0

45

2

살구 클럽에 대한 질문있습ㄴ디ㅏ

0

39

1

교안 158페이지 문의드립니다

0

37

2

코딩살구클럽 관련 건의사항

0

89

1

코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다

0

38

1

진행 방법 질문드립니다!

0

72

2

2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.

0

61

2

2주차 개념#12 트리 순회

0

32

2

백준사이트가 종료된다고 합니다.

0

299

2

백준 서비스 종료

9

912

1

sk 하이닉스 코테 대비

0

377

2

3-G 최댓값 질문

0

52

1

모듈러 연산 값이 10이 아닌 경우도 있지 않나요?

0

84

2

3-I 코드 질문드립니다.

0

63

2

3-N 질문 있습니다.

0

68

2

학습방법

0

103

2

4-H 질문 있습니다 (코드 리뷰)

0

67

2

코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.

0

178

2

2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.

0

70

2

2주차 개념 #4-2. 인접행렬 질문있습니다.

0

65

2

1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.

0

52

2

조합 재귀 풀이 확인 해주시면 감사하겠습니다.

0

69

2

함수별 시간복잡도

0

75

2