이 문제는 사실상 4개의 문제를 푸는 것과 같고, 어디서든 실수를 할 수 있기 때문에 굉장히 많은 디버깅을 필요로 합니다. 예제만 돌려보고 끝내지 말고, 질문 게시판의 다른 질문들도 모두 읽어보고, 스스로 다양한 코너 케이스를 수십, 수백 개 만들어서 디버깅하는 연습을 해봐야 합니다.
"입력되는 정수의 절댓값은 4,000을 넘지 않는다." 그러면 입력되는 정수는 최대 몇 가지 종류가 있을까요? 양수 쪽에 4000개, 음수 쪽에 4000개 해서 8000개일까요? 여기에 하나 더, 0이 있습니다. 그래서 개수를 세려고 하면 최소 8001칸의 배열이 필요합니다.
마찬가지로 -4000, 0, 4000 등의 값에 대한 처리가 항상 올바르게 이루어지는지 두 번, 세 번, 아니 열 번은 꼼꼼히 점검해 보세요. -4000, 0, 4000 등의 수에서 서로 겹치는 인덱스가 사용되고 있지는 않은지도 확인하고, -4000부터 4000까지의 수 8001개가 항상 검사 범위에 들어가고 있는지도 확인해 봅시다. 전체 질문의 약 1/3은 이 부분에서 실수가 있었다고 해도 과언이 아닙니다.
float는 너무나, 너무나 부정확하기 때문에 이 문제에 사용할 수 없습니다. float의 정확도는 겨우 6자리 정도인데, 이 문제에서는 무려 20억까지 가는 수를 저장해야 합니다. 이런 수를 float가 정확하게 표현할 수는 없습니다. 이 문제 뿐만 아니라, 거의 모든 경우에 실수형을 사용해야 한다면 double이 옳습니다. double로도 모자라서 long double을 사용해야 하는 경우가 있을 수는 있어도, float를 쓸 일은 없다고 보시면 됩니다. 이전에는 float로 나눈 코드가 통과되었지만, 이제 데이터가 추가되어 더 이상 통과되지 못합니다. (코드 약 600개가 이 데이터에 의해 틀리게 됐습니다.)
djm03178 4년 전 29
이 문제는 사실상 4개의 문제를 푸는 것과 같고, 어디서든 실수를 할 수 있기 때문에 굉장히 많은 디버깅을 필요로 합니다. 예제만 돌려보고 끝내지 말고, 질문 게시판의 다른 질문들도 모두 읽어보고, 스스로 다양한 코너 케이스를 수십, 수백 개 만들어서 디버깅하는 연습을 해봐야 합니다.