반례입니다
입력: 1000000
출력: 999959
정답: 0
2231번 - 분해합
안녕하세요?
윗 분 말씀대로 반례는 1000000이며 정상적인 출력은 0이지만 해당 코드에서는 999959가 출력되었습니다.
반례는 이미 있으니 왜 이러한 결과가 나왔는가를 설명드리겠습니다.
정상적인 코드에서는 이러한 방법으로 999959라는 수를 검사합니다:
반복문을 돌던 중 999959라는 수를 검사한다. 999999 + 9 + 9 + 9 + 9 + 5 + 9는 1000009이므로, 999959는 1000000의 생성자가 아니다. 결국 계속해서 1000000까지 수를 찾다가, 하나도 만족하는 결과가 없으므로 0을 출력한다.
그리고 작성하신 코드에서는 이러한 방법으로 999959라는 수를 검사합니다:
반복문을 돌던 중 999959라는 수를 검사한다. 999959에 9를 더한다. 999959 + 9는 999968이므로, 조건을 만족하지 않는다. 999968에 9를 더한다. 999968 + 9는 999977이므로, 조건을 만족하지 않는다. 999977에 9를 더한다. 999977 + 9는 999986이므로, 조건을 만족하지 않는다. 999986에 9를 더한다. 999986 + 9는 999995이므로, 조건을 만족하지 않는다. 999995에 5를 더한다. 999995 + 5는 1000000이므로, 조건을 만족한다. 999959는 1000000의 생성자이다.
이미 알고 계시겠지만, 생성자의 조건을 만족하려면 자기 자신 + 자신의 모든 자릿수를 다 더한 후 찾고자 하는 수가 되었는지를 검사해야 합니다.
작성하신 코드에서는 자릿수를 하나씩 더할 때마다 검사하는 상황이 되어, 모든 자릿수를 다 더하기도 전에 생성자를 찾은 것으로 인식하게 되어 문제가 발생한 것으로 보입니다.
이는 모든 자릿수를 더한 이후 한 번만 해당 수를 검사하도록 들여쓰기를 조금 수정하면 올바르게 작동할 것입니다.
문제가 해결되셨기를 바랍니다.
댓글을 작성하려면 로그인해야 합니다.
kate49143 2년 전
다 잘 나오는데 반례가 어느부분이 있는지 모르겟어요ㅠㅠㅠ
5%에서 틀렷다고 나옵니다.
a라는 리스트를 만들어서 생성자를 찾았습니다.