불안정 정렬과 버그
문제
<네이버의 코칭스터디 8기 Data Science>와 <파이썬으로 시작하는 데이터 사이언스>에 참여하여 과제를 풀던 도중 내 예상과 다르게 동작하는 정답 코드를 보았다. 저작권 때문에 코드를 공유할 수가 없어서 상황 설명이 힘들지만 간단히 얘기하자면 '가민수1, 다길동2.4, 나철수2.2'처럼 ㄱㄴㄷ순도 아니고 숫자순도 아닌 이상한 정렬 결과가 나왔다.
해결
문제의 핵심은 2가지였다. 1. 정렬을 먼저 한 후 반올림을 해야 한다. 2. 불안정 정렬을 유의해야 한다.
정답 코드는 반올림을 먼저 했기 때문에 데이터가 가민수1, 다길동2, 나철수2로 변환이 되어버렸다. 상황에 따라 다르겠지만 이런 코드는 의도와 다를 수 있기 때문에 조심해야 한다. 파이썬 내장 sort 함수는 안정 정렬인 tim sort(merge sort와 insertion sort의 변형)을 쓰지만 판다스는 불안정 정렬인 퀵소트를 사용한다. 따라서 데이터가 동순위일 경우 사실상 랜덤으로 결과값이 출력된다. 이 경우는 어쩌다 보니(구체적으로 말하자면 퀵소트의 피벗 선정 때문에) 다길동2가 나철수2보다 앞에 나와버렸다. 이 역시 상황에 따라 다르겠지만 의도와 다를 수 있기 때문에 조심해야 한다.
따라서 정렬을 먼저 한 후 안정정렬을 시행하니 예상과 부합하는 결과를 얻을 수 있었다.
느낀 점
사실 이 포스팅의 내용은 글로 적기에도 민망할 정도로 기초적인 정렬 알고리즘 정보이다. 하지만 비교적 공신력있는 인터넷 강의도 이런 기초적인 내용을 실수할 수 있다는 점과 기초적인 내용이 틀리더라도 코드 더미 속에서 이를 내가 직접 찾아내는 것은 힘들다는 점을 알 수 있었다.
'파이썬 > 정보' 카테고리의 다른 글
파이썬 파워소트의 구현과 설명 (0) | 2024.09.07 |
---|---|
파이썬 팀소트의 자바 구현의 버그 (0) | 2024.08.29 |
파이썬 이중리스트의 최댓값, 최솟값 (0) | 2023.09.07 |