강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

ksi2564님의 프로필 이미지
ksi2564

작성한 질문수

세계 대회 진출자가 알려주는 코딩테스트 A to Z (with Python)

그래프 최단 경로 알고리즘 (다익스트라) [문제 풀이] : BOJ 1753

백준에서 queue.PriorityQueue() 사용 시 런타임에러가 납니다.

해결된 질문

작성

·

24

0

BOJ 1753 최단경로 문제를 pypy3 환경에서 PriorityQueue를 이용해서 풀었을 때 런타임에러가 납니다. heapq로 푸니까 정답처리가 되더라고요.

강의 수강하시는 분들 중에서도 통과에 어려움을 겪는 분이 있을까봐 공유차 Q&A 게시판에 작성합니다!

 

더불어, GPT한테 해당 현상의 이유를 물어보니

queue.PriorityQueue가 멀티스레드용 동기화 큐라서
백준의 빡센 입력 + 제한 환경에서 시간/메모리/내부 예외로 터졌기 때문이고,
같은 로직을 heapq로 바꾸면 그 오버헤드가 사라져서 통과되는 것이다.

라고 하는데, 프로그래머스와 같은 기업 코테용으로 사용할때도 heapq로 구현하는 걸 기본으로 익히는 게 낫다고 보면 될까요?

답변 2

1

알리 Ally님의 프로필 이미지
알리 Ally
지식공유자

안녕하세요, ksi2564님!

(질문 등록 알람이 안 와서 좀 늦게 답변드렸네요.. 😅)

 

BOJ 1753 최단경로 문제를 PyPy3 + PriorityQueue로 제출할 경우 런타임 에러가 발생하는 이유는,
백준에서 제공하는 PyPy3 채점 환경이 queue.PriorityQueue를 정상적으로 지원하지 않기 때문입니다.

 

PyPy3 자체는 PriorityQueue 모듈을 포함하고 있지만, 백준의 PyPy3 실행 환경에서는 PriorityQueue 내부 동작 과정에서 예외가 발생하여 프로그램이 실행 도중 종료되는 문제가 확인됩니다. 따라서 동일한 코드라도 Python3에서는 통과하지만 PyPy3에서는 런타임 에러가 발생할 수 있습니다.

 

이와 같은 이유로, 실제 문제 해결 시에는 heapq를 우선적으로 사용하는 방식을 추천드립니다.

 

추가로, 이번 기회에 알아본 내용인데 queue.PriorityQueue는 원래 멀티스레드 환경을 위한 동기화 큐로 설계되어 있어 락(lock) 처리 등 부가적인 오버헤드가 존재합니다. 반면 heapq가볍고 빠른 최소 힙 기반 구현으로, 문제 풀이나 코딩 테스트 환경에서 더 효율적으로 동작합니다.

 

강의에서는 사용법의 직관성을 위해 PriorityQueue를 예시로 들었지만, 실전에서는 말씀하신 대로 효율성을 고려하면 heapq를 기본 우선순위 큐로 사용하는 방식이 더 안정적이고 적합합니다.

 


질문에 대해 만족스러운 답변이 되었기를 바랍니다!

추가로 궁금하신 점이나 더 자세한 설명이 필요하시다면 언제든지 말씀해 주세요. 😄

 

0

안녕하세요, 인프런 AI 인턴입니다. ksi2564님.

백준 1753 최단 경로 문제를 해결하는 과정에서 queue.PriorityQueue를 사용했을 때 발생하는 런타임 오류와 관련하여, heapq를 이용한 해결 방법과 추천 이유에 대해 설명드리겠습니다.

queue.PriorityQueue는 스레드 안전(thread-safe) 큐로, 내부적으로 락(lock)과 같은 메커니즘을 사용하여 스레드 간 안전성을 보장합니다. 이로 인해 멀티스레드 환경에서 매우 유용하지만, 스레드 안전성을 위한 추가적인 오버헤드가 발생하여 단일 스레드 환경에서는 성능 차이가 날 수 있습니다. 백준과 같은 플랫폼에서 queue.PriorityQueue를 사용할 경우 이러한 이유로 인해 제한된 시간과 메모리 내에서 런타임 오류가 발생할 수 있습니다.

반면 heapq는 표준 라이브러리로 제공되는 단순한 이진 힙 구현입니다. heapq는 스레드 안전성을 제공하지 않지만 성능이 뛰어나고 효율적인 메모리 사용이 가능합니다. 그 결과, 코딩 테스트와 같은 환경에서는 heapq의 사용이 더 적합한 경우가 많습니다.

따라서 프로그래머스와 같은 기업 코딩 테스트에서도 heapq와 같은 효율적인 자료구조를 사용하는 것이 추천됩니다. 이는 성능 최적화에 도움이 되며, 불필요한 오버헤드를 줄여 문제 해결에 유리합니다.

관련 질문에서 제공된 해결 방법과 유사한 설명은 “queue.PriorityQueue와 heapq의 차이” 질문에서도 확인할 수 있으며, 사용 상황에 맞는 자료구조 선택이 중요함을 알 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

ksi2564님의 프로필 이미지
ksi2564

작성한 질문수

질문하기