tmddus3002   1년 전

예시로 nums 에 8 과 9 를 넣으면 i가 소수가 아닌 8을 nums에서 잘 지우지만, 9로 넘어가지 않고 그대로 종료되어버립니다.

따라서 1이 출력됩니다.

이해가 되지 않아 예외가 있나 해서 nums에 9만 넣어보면 9가 잘 지워지며 0이 출력됩니다.

추가로 8,9,10 을 넣어보면 8을 지우고 9는 넘어가고 10은 또 잘 지워집니다.

자꾸 소수가 아닌 수를 지우고 바로 다음 숫자를 건너 뛰는게 이해가 되지 않습니다.

설명 한번 만 부탁 드립니다. ㅠㅠ

djm03178   1년 전

리스트를 순회하면서 도중의 원소를 지우는 것은 매우 위험한 일입니다. 리스트를 순회한다는 것은 인덱스를 0, 1, 2 이렇게 증가시켜가면서 해당 인덱스에 있는 수를 하나씩 가져온다는 뜻입니다. 그런데 [8,9,10]이 있던 상황에서 0번째 원소를 지우면 어떻게 될까요? [9,10]이 되고, 그 다음 루프를 돌 때는 1번째 원소를 빼와야 하는데 현재 상태에서 1번째 원소는 9가 아니라 10입니다. 그래서 9를 건너뛰게 되는 것입니다.

tmddus3002   1년 전

댓글 감사합니다.

하지만 말씀하신 상황을 대비하기 위해 인덱스를 사용하는 del 대신 remove를 사용해 직접적으로 i를 제거했는데도 언급하신 상황이 발생하게 되는건가요?

tmddus3002   1년 전

수정하여 1~100 , 1~200 까지 넣고 돌려봤는데 맞아서 제출하니 틀렸다고 뜨네요... 혹시 반례를 알 수 있을까요?

djm03178   1년 전

del이든 remove든 상관 없습니다. 중요한 것은 루프를 도는 로직은 인덱스에 기반한다는 것이고, 그 안의 어떤 원소를 지우는 것은 그 뒤의 원소들을 전부 한 칸씩 당겨오는 연산으로 이루어져 있다는 점입니다. 이러한 로직이 있는 한 해당 코드는 올바르게 동작할 수가 없습니다.

아래 코드의 반례는 다음과 같습니다.

https://ideone.com/lgFQ1i

어떠한 경우에도 순회 중인 루프의 원소는 지우지 않도록 하는 것이 좋습니다.

tmddus3002   1년 전

정말 감사합니다.

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