PS/자주 하는 답변

PyPy3로 제출하면 통과됩니다.

djm03178 2023. 1. 11. 14:26

BOJ에서는 Python 3를 위한 제출 언어를 두 가지 제공하고 있습니다. 기본 CPython 인터프리터를 사용하는 Python 3와, 일반적으로 훨씬 빠른 속도를 자랑하는 인터프리터인 PyPy3입니다. 이 글에서 하고 싶은 말이 벌써 나왔습니다. PyPy3는 Python 3보다 일반적으로 훨씬 빠르므로, 문제도 PyPy3로 풀기를 권장합니다.

 

공식 홈페이지의 언급에 의하면 PyPy는 CPython에 비해 평균적으로 4.8배가 빠르다고 합니다. 모든 종류의 벤치마킹에서 항상 빠른 것은 아니지만, 적어도 PS 중에는 Python 3을 굳이 쓸 이유가 저는 웬만하면 없다고 생각합니다. 시간 보너스도 3배 + 2초로 동일하게 주어지는데 일부러 느린 것을 쓸 필요가 없습니다. 처음부터 언어를 PyPy3로 고정하세요.

 

이렇게 말씀드리면 추가로 자주 나오는 질문은 "코딩 테스트에서는 기본 Python을 쓸 텐데 이걸로 연습하고 시간 감각을 익히는 게 좋지 않겠냐"라는 것입니다. 틀린 말은 아니지만, 그럼에도 불구하고 PyPy3 사용을 적극 추천드리는 이유는 다음과 같습니다.

  • BOJ 문제들의 시간 설정은 결코 Python 3에 친화적이지 않습니다. 애초에 거의 대부분의 문제는 태생적으로 C/C++, 많아야 Java까지 이외의 언어의 통과 가능성 여부에 그다지 신경을 쓰지 않습니다. CPython의 느림을 감당하기에 3배 + 2초라는 시간 보너스는 많은 경우에 역부족입니다. PyPy3에게는 이것이 대부분의 경우 충분한 시간 보너스입니다.
  • 코딩 테스트와 BOJ의 시간과 입력 제한의 설정 기준이 다릅니다. 기업들도 당연히 문제를 만들 때 Python으로 문제를 풀 수 있는지 여부를 자체적으로 확인을 합니다. Python이 너무 느리다면 그만큼 제한을 풀어서 통과가 될 수 있는 수준으로 만들어 줄 것입니다. (그냥 Python으로 풀지 말라고 내는 문제도 간혹 있지만, 그런 경우까지 고려할 거라면 처음부터 C++을 공부했어야 합니다.) 반면에 BOJ는 비록 코딩 테스트 연습을 위한 문제라고 하더라도, 애초부터 PyPy3라는 더 빠른 도구를 지원하기에 굳이 Python 3의 기준에 맞추어 제한을 설정하지 않습니다. 느린 언어를 위해 시간을 늘려주는 건 빠른 언어에서의 비효율적인 코드를 통과시켜 줄 위험성을 안고 있기 때문에 그것을 감수하면서까지 지나치게 제한을 느슨하게 하지는 않을 것입니다. 출제 기준에서 요구하는 Python으로의 검증도 PyPy3만 통과할 수 있으면 인정됩니다.
  • 코딩 테스트에서의 시간에 적응하는 연습을 할 바에야, 더 많은 문제를 푸는 연습을 하는 게 낫습니다. 충분히 좋은 로직임에도 태생적인 불리함에 의해 통과되지 못하고 있는 코드를 개선하겠다고 몸부릴 칠 시간에 다른 문제를 하나 더 잡는 것이 낫습니다.
  • 잦은 Python 3 제출은 채점 서버를 괴롭힙니다.