wrllrw   2년 전

10 5
1 2 3 4 2 5 3 1 1 2

저는 이 예제를

Two pointer 알고리즘으로 풀며, left와 right를 0~9(N-1) 까지로 설정했습니다.

채점 번호 10241282입니다.

여기서 

right = 8, left = 6일 경우

-> right = 9, left = 6

-> right = 9, left = 7

-> right가 10이되며  == N이 됐기 때문에 break를 해야 하는데, 저는 그런 설정을 안 했는데도 정답으로 채점됐습니다.

원래대로라면 vector를 N크기만큼 설정했기 때문에 0~9까지만 참조해야 하는 상황에서 vec[N]을 참조해도 문제가 되지 않았습니다.

즉, 이런 테스트 케이스가 없던 것입니다.

이 소스 코드를 개선한 게 

채점 번호 10241860의 33번째 줄이고, 위에서 언급한 사례가 걸러내져야 한다고 생각합니다.

djm03178   2년 전

vector에 할당된 범위를 벗어난 인덱스를 [] 연산자로 참조하는 것은 undefined behavior입니다. 즉, 무슨 일이 일어나도 이상하지 않습니다.

[] 연산자는 그냥 단순히 배열의 시작 주소로부터 주어진 거리만큼 떨어진 메모리 위치를 참조하는 것이기 때문에 그 위치에 정답을 변하지 않게 할 값이 들어있었다면 그대로 정답이 출력되는 것도 이상하지 않습니다. 메모리는 실제로는 요청된 것보다 더 큰 단위로 할당되기 때문에 인덱스를 1 정도 벗어난다고 해서 꼭 런타임 에러가 되는 것도 아닙니다.

wrllrw   2년 전

아 ~ 비주얼 스튜디오로 돌리니까 에러 뜨길래 글남겼는데, gcc로 돌려보고 글을 쓸 것을 그랬네요. 감사합니다.

djm03178   2년 전

비주얼 스튜디오도 Release로 하면 에러가 안 날 가능성이 높습니다. Debug 모드에서는 범위를 체크하는 코드가 삽입되기 때문에 그런 에러를 잡을 수 있습니다.

wrllrw   2년 전

아...... 감사합니다! 문제 푸는데 도움 많이 됐습니다.

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