목차
파이썬 에러
백준에서 파이썬 문제를 풀 다 생긴 오류 사항에 대해 공유합니다. 2023년 정보올림피아드 2차 초등부, 중등부 문제인 고기파티를 풀다 생긴 오류 입니다.
문제를 이미 풀긴 했지만 코드의 최적화나 다른 방향으로 풀어보기 위해 이렇게 저렇게 바꿔 보았는데 도저히 알 수 없는 부분에서 계속 TypeError가 발생했습니다. 수정된 부분중 어디가 문제인지 확인하기 위해 하나씩 내용을 원래대로 바꿔가던 중 원인을 찾을 수 있었습니다.
원인 찾기
파이썬 문제를 풀 때 이분 탐색을 사용하려면 bisect 모듈을 사용합니다. C++에서 upper_bound와 같은 역할을 하는 bisect_right 함수를 사용해서 문제를 해결했었습니다.
bisect_right, bisect_left 함수를 보니 key를 사용할 수 있길래 key를 사용하는 로직으로 변경하였던 것이 문제 입니다. key를 사용하면 2차 배열이나, 클래스등을 lambda를 사용하여 정렬할 수 있습니다. key를 사용하도록 하였고, 실제로 로컬에서 작동시킬 때에는 잘 돌아갔습니다.
bisect_right(arr, x, key=lambda x : x[0])
문제는 백준에 제출했을 때 에러가 발생했었고, 도저히 원인을 못찾았습니다. 위 코드가 바로 문제의 코드 입니다. 몇 시간에 걸처 원인을 찾다 찾다 눈에 들어온 한 문장이 있었습니다.
Changed in version 3.10: Added the key parameter.
파이썬 3.10 부터 bisect_right, bisect_left 함수에 key 필드를 추가하였다는 뜻입니다. 즉 3.10 이하 버전에서는 key를 사용할 수 없다는 뜻입니다. 혹시나 하고 백준 pypy3의 버전을 확인해 보았습니다.
백준은 PyPy3 버전이 3.9 입니다. 따라서 bisect 모듈에 key 파라메터를 사용할 수 없습니다. 혹시라도 저처럼 bisect 함수를 사용하는 사람은 참고하시길 바랍니다.
해결 방법
key를 사용하지 못하기 때문에 1차원 형태의 리스트만 사용가능합니다. 1차원 이상의 리스트를 사용한다면 1차원 형태로 바꿀 수 있는 방안을 고려해야 합니다. 추가적으로 백준의 python3의 버전은 3.11 입니다. PyPy3에서는 오류가 나더라도 python3에서는 오류가 나지 않을 수 있습니다. 하지만 시간초과로 문제해결은 되지 않았습니다.
'오류 해결' 카테고리의 다른 글
백준 파이썬 RecursionError (0) | 2023.09.07 |
---|