dongwon1226   4년 전

주어진 코드를 실행하게 되면 제묵에 있는것처럼 90% 에서 런타임 에러가 납니다.

하지만 아래 코드의 9번째 줄을 vector<int> cntLefts[10001]; 로 바꾸고

24번 줄을 삭제 하였더니 맞았습니다 의 결과가 나왔습니다.

이유가 무엇일까요?


domece   4년 전

38번째 줄의 cntLefts[i].size() > 0 체크 부분에서

만일 i = n + 1일때 조건식이 실행되면 문제가 생깁니다.

24번 줄에서 cntLefts.resize(n+1) 대신 cntLefts.resize(10001)으로 고치면 맞을것같습니다

wjsqjawns   4년 전

입력으로

1

1 -1 -1

을 넣고, 38번째 줄의 for문에서 cntLefts[i].size()를 출력해보면 원인이 보이실 겁니다.

dongwon1226   4년 전

// wjsqjawns

5cef2afc-574a-4cb6-9895-cf2c920ffb10

말씀하신대로 38라인의 for 문 안에 

printf("cntLefts[%d].size() : %ld\n", i, cntLefts[i].size()); 

코드를 삽입해 보았습니다.

아래와같은 출력값이 나오는데 어떤 원인이 있나요?? ㅜㅜㅜ 

// domece
말씀하신대로 코드 수정후 제출하니까 맞았습니다가 나옵니다.

하지만 설명을 이해하기는 아직 부족한가 봅니다...ㅠㅠ

혹시 예시를 들어서 설명해주실수 있나요?

domece   4년 전

n이 100이고, cntLefts는 0번은 사용하지 않으니 cntLefts[1]부터 cntLefts[100]까지 전부 사용된 상태라고 해 봅시다.

i=100까지는 문제없이 작동합니다. 하지만 i=100일때 반복문이 실행된 다음 일어나는 과정을 자세히 살펴봅시다.

  1. 증감식 i++가 실행됩니다. i의 값은 100에서 101이 되었습니다.
  2. 조건식을 판별하여 아래의 반복문을 실행할지 판단합니다. 조건식은 cntLefts[i].size() > 0 입니다.
  3. i=101이므로 조건식은 cntLefts[101].size() > 0 입니다.
  4. cntLefts는 n + 1칸만 할당했으므로 cntLefts[100]까지는 존재하는 범위지만 cntLefts[101]부터는 존재하지 않는 인덱스입니다.
  5. 오류가 발생합니다.

결론만 말하자면 10칸짜리 vector에서 11번째 칸의 값을 구하려 해서 생기는 문제입니다.

dongwon1226   4년 전

// domece

아하! 친절한 설명 감사합니다.

말씀하신것을 바탕으로 다시 비교해서 생각해본다면

n = 100 으로 했을 경우

resize(n+1) 을 하게되면 101 번째는 존재하지 않는 인덱스이기 때문에 말씀하신 시나리오에서 오류를 발생하지만

resize(10001) 을 하게 되면 101번째 인덱스에 대한 오류가 안나오기 때문이라고 이해해도 될까요? 

다만 의문점이 더생겨버리고 말았습니다..

Q1. 하지만 n 이 10000 (최대값) 일때 cntLefts[100001].size() 을 실행하게 되면 오류가 발생하는것 아닌가요?

Q2. 그러면 왜 90% 까지 보여지고 런타임 에러가 나는걸까요? 말씀하신것이 문제가 된다면 첫번째 테스트 케이스에서 부터 에러가 나야되는것 아닐까요??

다시한번 친절한 답변 감사합니다!!

djm03178   4년 전

배열의 범위를 넘어서서 접근하는 것은 무슨 일이 일어날지 모르는 것이지, 반드시 에러가 난다고 정해진 것이 아닙니다. '무슨 일' 중에는 '아무 문제 없이 잘 진행되는' 것도 포함됩니다.

dongwon1226   4년 전

// djm03178 

아하... 감사합니다. 완전 깨닳음을 배운거 같아요.

24번째 줄을  cntLefts.resize(n+2); 로 바꾸니까 맞았습니다가 나오네요.

앞서 말씀하신분들도 다들 감사합니다.

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