38번째 줄의 cntLefts[i].size() > 0 체크 부분에서
만일 i = n + 1일때 조건식이 실행되면 문제가 생깁니다.
24번 줄에서 cntLefts.resize(n+1) 대신 cntLefts.resize(10001)으로 고치면 맞을것같습니다
2250번 - 트리의 높이와 너비
// wjsqjawns
말씀하신대로 38라인의 for 문 안에
printf("cntLefts[%d].size() : %ld\n", i, cntLefts[i].size());
코드를 삽입해 보았습니다.
아래와같은 출력값이 나오는데 어떤 원인이 있나요?? ㅜㅜㅜ
// domece
말씀하신대로 코드 수정후 제출하니까 맞았습니다가 나옵니다.
하지만 설명을 이해하기는 아직 부족한가 봅니다...ㅠㅠ
혹시 예시를 들어서 설명해주실수 있나요?
n이 100이고, cntLefts는 0번은 사용하지 않으니 cntLefts[1]부터 cntLefts[100]까지 전부 사용된 상태라고 해 봅시다.
i=100까지는 문제없이 작동합니다. 하지만 i=100일때 반복문이 실행된 다음 일어나는 과정을 자세히 살펴봅시다.
결론만 말하자면 10칸짜리 vector에서 11번째 칸의 값을 구하려 해서 생기는 문제입니다.
// domece
아하! 친절한 설명 감사합니다.
말씀하신것을 바탕으로 다시 비교해서 생각해본다면
n = 100 으로 했을 경우
resize(n+1) 을 하게되면 101 번째는 존재하지 않는 인덱스이기 때문에 말씀하신 시나리오에서 오류를 발생하지만
resize(10001) 을 하게 되면 101번째 인덱스에 대한 오류가 안나오기 때문이라고 이해해도 될까요?
다만 의문점이 더생겨버리고 말았습니다..
Q1. 하지만 n 이 10000 (최대값) 일때 cntLefts[100001].size() 을 실행하게 되면 오류가 발생하는것 아닌가요?
Q2. 그러면 왜 90% 까지 보여지고 런타임 에러가 나는걸까요? 말씀하신것이 문제가 된다면 첫번째 테스트 케이스에서 부터 에러가 나야되는것 아닐까요??
다시한번 친절한 답변 감사합니다!!
// djm03178
아하... 감사합니다. 완전 깨닳음을 배운거 같아요.
24번째 줄을 cntLefts.resize(n+2); 로 바꾸니까 맞았습니다가 나오네요.
앞서 말씀하신분들도 다들 감사합니다.
댓글을 작성하려면 로그인해야 합니다.
dongwon1226 4년 전
주어진 코드를 실행하게 되면 제묵에 있는것처럼 90% 에서 런타임 에러가 납니다.
하지만 아래 코드의 9번째 줄을 vector<int> cntLefts[10001]; 로 바꾸고
24번 줄을 삭제 하였더니 맞았습니다 의 결과가 나왔습니다.
이유가 무엇일까요?