pch3320   2년 전

예외처리가 없으면 런타임 에러 예외처리가 있다면 틀렸다고 뜨는데 그에 대한 이유를 알고싶습니다. 인터넷을 찾아보면 솔루션만 나와있고, 이와 비슷하게 코드를 쓰신분들도 그냥 안된다 정도로만 설명하고 안되는 이유에 대한 설명이 없어 궁금합니다.

bamgoesn   2년 전

일단 try문을 사용했을 경우, 코드에 발생하는 오류가 수정되지 않았는데 그걸 그저 "뭐든지간에 오류가 생기면 0을 출력해라"로 바꾸니, 원래는 에러가 나던 게 0이 출력되는 것으로 바뀌어, 정답이 0이 아닌데 에러가 나던 입력에 대해 0을 출력해서 틀렸습니다를 받는 것임을 먼저 알려드립니다.

-------------------

이와 같이 코드를 제출했는데 런타임에러를 받게 되면, 우선 런타임 에러의 종류를 먼저 확인해보세요.

확인해봤더니 런타임 에러의 종류가 IndexError입니다. 모르면 구글에 그대로 python indexerror라고 검색해보면 나오는데, 리스트나 문자열 등에 인덱싱을 할 때 범위를 넘어가서 생기는 오류라고 하네요.

이와 같은 과정을 거치면 에러가 나는 위치의 후보가 제한되기에 에러를 수정하기 쉬워집니다. 이 코드의 경우는 인덱싱을 하는 위치가 5행뿐이므로 5행에서 문제가 발생하는 것임을 알 수 있습니다.

-------------------

이제 디버깅을 해야 하는데, 디버깅을 할 때엔 최대한 자신의 코드를 공격한다는 마음을 가지고 해야 합니다. 실제론 말이 쉽지 어려운 과정으로, 지금은 그 바람직한 과정을 알려드리겠습니다.

arr2[N-1]이 범위를 벗어난다는 건 arr2의 길이가 N보다 짧은 경우가 있다는 의미이므로, 입력에 따라 arr2가 어떻게 나오는지 생각을 해봐야 합니다.

arr2를 확인하기 위해 4행과 5행 사이에 print(arr2)를 넣고 예제를 입력해봤더니 arr2가 5714285714285716임을 알 수 있습니다. 그러면 N이 이 길이보다 길어지면 IndexError가 발생함을 알 수 있게 됩니다.

-------------------

다만 이와 같은 생각을 하는 게 어려울 수 있습니다.

오답이 나왔을 때 그나마 반례를 쉽게 찾을 수 있는 방법은 https://www.acmicpc.net/blog/v...의 반례찾기 문단에 설명되어 있으니 참고해보세요.

이것 외에도 https://www.acmicpc.net/help/q...에서 맨 위에 링크된 글을 읽어보면 좋습니다. 이 글 자체도 좋은 내용이 있고요.

pch3320   2년 전

네 감사합니다. 이 코드자체에서 계산하는 자릿수때문에 정답처리가 여전히 안되지만 디버깅에 대한 생각을 알수있었습니다.

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