결국엔 풀지 못한 문제... 틀과 구현 방법은 머리로 떠오르지만, 막상 코드로 풀어내지 못한 문제입니다.
그래서 정말 제일 깔끔하게 잘 풀었다고 생각하는 분의 코드를 가져왔습니다.
너무 큰 도움이 되었습니다. 감사합니당.
참고: https://eunne.tistory.com/m/30
보고 이해하는 것도 오래 걸림 ;-;
우선 가장 큰틀을 짜야 합니다. 바로 셀프넘버와 셀프넘버가 아닌 숫자를 구해주는 함수들입니다.
코드의 순서대로 설명.
1. NotSelfNumber 함수와 selfnumber 함수가 정의되었고, 가장 마지막 줄에 selfnumber 함수에 값에 10000이라는 인자값이 할당됩니다.
2. selfnumber 함수 내부의 첫번째 for문이 있습니다. 그 안에서는 index 값에 NotSelfnumber(i) 값이 저장됩니다. 여기서 한번 더 NotSelfnumber 함수에 i값들이 인자로 할당됩니다. 따라서, NotSelfnumber 함수로 이동하게 됩니다.
3. NotSelfnumber 함수 내부의 while문은 생성자가 존재하는 숫자들을 출력해 줍니다.
예를 들어, N = 133 이라고 하겠습니다.
<1> sum += 133 % 10 은 즉, 133의 1의 자리 수인 3을 sum 값에 누적하겠다는 말입니다. sum = sum + 3 이므로 초기값 133+3이 sum 값.
<2> 그리고 N = parseInt(N/10) 은 즉, 133의 나미저값인 100의 자리, 10의 자리 수를 말합니다. 이때, 나머지값을 소수점을 없애고 정수형으로 만들기 위해 parseInt를 사용한 것입니다.
<3> 아직 N값이 0 이 아니므로 반복문은 계속됩니다. 따라서, 13이 된 N 값은 한번 더 똑같은 과정을 거치고, sum 값에는 10의 자리 수인 3이 누적됩니다.
<4>그리고 백의 자리 1이 N값이 됩니다. 그렇게 한바퀴를 더 돌면 sum 값에 100의 자리 1까지 누적됩니다.
<5> 그렇게 N 값은 더 이상 나눌게 없는 0값이 되고 반복문을 빠져나옵니다.
<6> 지금 까지 누적된 값 sum = 133 + 3+ 3+ 1 이고, return에 의해 NotSelfnumber(i) 값으로 보내집니다.
4. 예시와 같은 과정이 1부터 10000까지 반복되고, 그 값들은 index에 저장됩니다.
그리고 저장될때마다 if문에 의해 10000보다 작은 결과값은 selfnum의 인덱스 값으로 저장됩니다. 이때 그 값들에 true 값을 줍니다.
5. 그 다음 for문에서는 셀프넘버인지 아닌지를 구분해줍니다. if문의 조건식을 보면 !selfnum[i]을 볼 수 있습니다. 이 뜻은 false 갑들을 의미합니다.
즉, 셀프넘버(false) = 전체 숫자(1~N) - not셀프넘버(true)를 나타냅니다.
6. 이 값들이 result 배열에 push메서드를 통해 값들이 저장됩니다.
7. 마지막으로, 그 배열 값들을 띄어쓰기가 적용된 상태로 출력하면 답이 나옵니다.