khk7129   3년 전

일단 제가 사용한 자료구조는 disjoint_set으로 풀었습니다. 현재는 맞힌 상태인데 궁금한 점은 제가 오답이었을 때 이유가 "런타임 에러"가 아닌 "틀렸습니다"인 이유인데요

일단 오답인 이유는 vector<int> g_vec(100001, -1); // pre : g_vec(100000,-1) <- 이 부분입니다

G의 범위가 105 였는데 1부터 임으로 g_vec을 100001까지 설정하지 않고 100000을 범위로 설정해서 "틀렸습니다"가 나왔습니다.

그런데 "틀렸습니다"가 아니라 "런타임에러"가 맞지 않나요?

제 알고리즘 flow를 보시면 아시겠지만, g_vec[n]에서 n의 값이 -1이면 true를 return하면서 자료구조에 merge()하는 형식인데(중요하지 않아서 다 안적었음)

"틀렸습니다"가 나온 이유가 g_vec[100001]에 접근해서 에러가 난 것이니까요( 수정 전 : g_vec(100000,-1) )

왜 "틀렸습니다"인지 알려주실 수 있나요??

djm03178   3년 전

vector::operator[]는 인덱스의 범위 검사를 하지 않습니다. 따라서 범위를 벗어난 인덱스에 접근했을 때 어떻게 된다고 정해진 것이 없습니다. 런타임 에러가 나도 정상이고, 이상한 값을 읽어들여서 틀렸습니다가 나도 정상이고, 심지어는 우연히 정상적인 값을 읽어서 맞았습니다를 받아도 정상입니다.

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