eastho0116   2년 전

같은 문제를 두번이나... 질문하다니... 정수리를 보이겠습니다... 어디가 틀렸는지 모르겠습니다... 

bamgoesn   2년 전

11행 while 문에서 cnt++;이 빠졌습니다 :) 때문에 cnt가 언제나 1이라서 Ret_sum(i)가 i와 그 1의 자리수만 더하고 있습니다.

추가로...

11행 while문 바로 다음 13행에서 if (cpy < 10) break;를 넣으셨는데, 이는 while (cpy<10)과 완전히 동일합니다. 어떻게 쓰셔도 동작은 동일합니다만 가끔씩 while문의 맨 앞이 아닌 맨 뒤에 break 조건을 넣었다가 오답을 받고 헤매는 경우도 많아서... 알아두시면 좋을 것 같습니다.

그리고 저번에 제가 제대로 못 봤는데, 38행 for문이 2중 루프더라고요? 이 부분을 1중 for문으로 고치면 훨씬 더 효율적인 코드를 짤 수 있습니다.

39행의 for문을 10000번 돌면서 i의 값은 변하지 않는데, 41행에서 Ret_sum(i)를 반복적으로 호출합니다. 일단 여기서 효율성이 떨어진다는 걸 인지하셨으면 합니다.

그리고, 39행의 for문은, Ret_sum(i)의 값을 v라고 했을 때, num[k]==v인 k를 찾는 과정이라고 할 수 있습니다. 그런데, num[k] = k+1이기 때문에 num[k]==v인 k는 결국 k+1==v인 k입니다. 따라서 굳이 k를 루프돌리지 않아도 찾고자 하는 k가 v-1이라는 것을 바로 찾아낼 수 있습니다. 이 점을 활용하면 코드의 시간복잡도를 O(n)으로 줄일 수 있습니다. (지금은 O(n^2)입니다)

eastho0116   2년 전

흑흑 이런 고수님을 만나다니 정말 다행입니다...ㅠㅠㅠㅠ 정말 감사합니다. 많이 배웠어요ㅠㅠ

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