clrmt   1년 전

이런 경우는 참 황당하네요. 다른 분들도 이런걸 겪으셨는지 모르겠습니다.

여기서 루프문 안의 cout을 지우면 런타임에러가 뜨지 않습니다.

라이브러리나 namespace는 전부 체크했습니다.


이 코드의 몇 가지 특징들을 간략히 적으면 다음과 같습니다.

- 약 200만개의 전역 int를 선언한 상태(처음에는 지역으로 선언하였다가, 스택오버플로우의 가능성때문에 전역으로 바꿈)

- 최대 40만번의 루프를 돌 수 있으며, 재귀호출이나 무한루프는 없음.

- 문제에서 제시하는 값의 범위를 초과하지 않음.(아마?)

- 다른 컴파일러에 복사 붙여넣기해서 실행하면 이상이 없다.


djm03178   1년 전

" - 문제에서 제시하는 값의 범위를 초과하지 않음.(아마?)"

여기가 땡입니다. totalWeight는 최대 799994인데, 66번째 줄 등에서 최대 799992번째 인덱스에 접근하게 됩니다.

그리고 런타임 에러는 잘못된 행동을 한다고 해서 항상 뜨는 것이 아니고 운이 작용하기 때문에 이랬다 저랬다 할 수도 있기 때문에 반드시 cout이 원인이라고 할 수는 없습니다. 물론, 그 문장 때문에 컴파일러의 최적화 동작이 달라져서 저 행동이 segmentation fault를 더 잘 일으키게끔 만들 수도 있지만, 그건 컴파일러의 내부 동작을 보지 않는 이상은 모릅니다.

" - 다른 컴파일러에 복사 붙여넣기해서 실행하면 이상이 없다."

당연히 그냥 실행만 하면 문제가 없고, 문제가 될 만한 입력을 넣어야 문제가 생깁니다. 그건 채점 서버에서도 마찬가지입니다.

clrmt   1년 전

디버깅이 참... 어렵네요.

답을 딱 알 수도 없는 노릇이고...

clrmt   1년 전

숫자 하나 바꿔서 성공했네요. 감사합니다.

clrmt   1년 전

서버 컴파일러가 기본적으로 컴파일 최적화를 하는 모양이네요. cout을 지우면 유효한 실행문이 없기 때문에 for문 자체를 폐기한 것 같습니다.

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