ploffer11   7년 전

세그먼트트리 + 분할정복으로 풀었는데

정말 이해가 안되게 런타임에러를 받습니다.

이 풀이와 똑같은 풀이로 히스토그램에서 가장 큰 직사각형 문제를 풀었는데 뭐가 문제인지 모르겠습니다.

58퍼에서 런타임 에러를 받습니다. ㅜㅜ

ploffer11   7년 전

..해결했습니다. 

pypy3에서 setrecursionlimit가 작동을 안했나봐요. python3로 제출해서 맞았습니다.

근데 이해가 안되는 게 어떤 글에서 "pypy3에서 setrecursionlimit는 먹지 않는다" 라고 봤는데, 


제가 다른 문제에서 런타임 에러를 받았을 때 pypy를 유지한채 setrecursionlimit만 고쳐 AC를 받은 적이 있습니다. 

하지만 이 문제에서는 또 setrecursionlimit가 안먹고..

뭐가 맞는 말인지 모르겠습니다..

djm03178   7년 전

그게 어떤 문제인가요? 제가 알기로는 setrecursionlimit은 PyPy3에서 아무 효과가 없는 것이 맞습니다.

ploffer11   7년 전

제가 다른문제에서 pypy3를 유지한 채로 setrecursionlimit만 바꿔서 AC를 받은적이 꽤 있습니다.

소스코드를 좀 찾아봐야 알겠지만 분명 겪어본 적 있습니다.

ploffer11   7년 전

방금 제출해보고 왔습니다.

이문제와 거의 동일한 문제인 "히스토그램에서 가장 큰 정사각형" 코드이며, 

런타임에러와 맞았습니다 코드의 차이는

import sys

sys.setrecursionlimit(300000)

밖에 없습니다.

코드 첨부합니다.

http://boj.kr/7397264742294df3...    : RTE

http://boj.kr/5da34992d5d34bdc...    : AC

djm03178   7년 전

신기하네요. PyPy에 대한 정보가 잘 안 보여서, 제가 찾을 수 있는 건 이 정도인 거 같습니다.

http://doc.pypy.org/en/latest/release-1.4.1.html

"Made sys.setrecursionlimit() a no-op. Instead, we rely purely on the built-in stack overflow detection mechanism, which also gives you a RuntimeError – just not at some exact recursion level."

njw1204   7년 전

일단 setrecursionlimit은 작동하긴 합니다.

그런데 정확하게 작동하지 않고, 대략적으로 맞게 작동합니다.

무슨 말이냐면

http://doc.pypy.org/en/latest/cpython_differences.html 여길 보면

sys.setrecursionlimit(n) sets the limit only approximately, by setting the usable stack space to n * 768 bytes. On Linux, depending on the compiler settings, the default of 768KB is enough for about 1400 calls.

이렇게 나와있습니다.

pypy에서 런타임 에러가 난 이유는 제 생각에는 setrecursionlimit과는 관계없이 pypy가 더 많은 메모리를 잡아먹다보니 런타임 에러가 난 것 같습니다.


ploffer11   7년 전

히스토그램에서 가장 큰 직사각형과 비교했을 때 메모리가 128MB / 256MB로 차이가 나긴 하네요.

정말 메모리가 이유일 수도 있을 것 같습니다.

파이썬으로 PS하다보면 정말 별에별 일이 다 있네요..

댓글을 작성하려면 로그인해야 합니다.