<자릿수의 합>
: N개의 자연수가 입력되면 각 자연수의 자릿수의 합을 구하고, 그 합이 최대인 자연수를 출력하는 프로그램을 작성한다. 자릿수의 합이 같은 경우 원래 숫자가 더 큰 숫자를 답으로 한다. 만약 235와 1234가 동시에 답이 될 수 있다면 더 큰 값인(자릿수랑 상관X) 1234가 답이 되어야 한다.
- 첫 번째 방법 : 직접 while문 돌리면서 푼다. x의 원래값을 잃으면 안되므로, 새 변수를 선언해야 한다는 거 명심!
- 두번 째 방법 : 배열내장객체함수 이용해서 푼다. reduce를 이용해서 sum을 구해줄 건데, 먼저 reduce는 배열 내장 함수다. 그러므로 배열로 만들려면 split를 이용하면 되는데, split는 문자열을 분할하는 메서드라 toString()을 한 후 하도록 한다.
한 번 정리해보자. 먼저 for..of에서 x값은 number타입이다.(배열에서 숫자타입으로 돼 있으니 당연하겠지) x.toString().split('').reduce((a,b) => a+Number(b),0) !
b를 number타입으로 변환시켜줘야하는거 명심!- 어떤 방법이든 꼭 answer엔 sum이 아닌 x(원래꺼)를 넣어 줘야 한다는 걸 명심!!!
! 플러스 개념!
- String(x)과 x.toString()의 차이는, 둘 다 숫자를 문자열로 변환하는 기능을 하지만, toString()는 Number메서드라는 것이다.
- 타입이 헷갈릴 땐 console.log(type of x);를 해서 확인해보자.
<script> //while문으로 직접 자릿수 function solution(n, arr){ let answer, max = Number.MIN_SAFE_INTEGER; for(let x of arr){ let sum = 0, tmp = x; //x원본 지키기 while(tmp){ sum += (tmp%10); //나머지 tmp = Math.floor(tmp/10); //몫 } if(sum>max){ max = sum; answer = x; //x원본넣기 } else if(sum===max){ if(x>answer) answer = x; } } return answer; } let arr=[128, 460, 603, 40, 521, 137, 123]; console.log(solution(7, arr)); </script>
<script> //배열 내장 함수 function solution(n, arr){ let answer, max = Number.MIN_SAFE_INTEGER; for(let x of arr){ let sum = x.toString().split('').reduce((a,b) => a+Number(b), 0); if(sum>max){ max = sum; answer = x; //x원본넣기 } else if(sum===max){ if(x>answer) answer = x; } } return answer; } let arr=[128, 460, 603, 40, 521, 137, 123]; console.log(solution(7, arr)); </script>
야호 드디어 블루투포스를 배우는구나!!(사실 뭔지 모름ㅋㅋ) 얼른 꾸준히 해서 DFS, BFS도 뭔지 배우고 싶다!!! 영화스포는 잘만 보면서 이런 건 미리 안봄. 이유는 기대감을 더 가지기 위해서! 그리고 로직은 이제 대강 짤 줄 아는데, 조건문을 어설프게 쓰는 거 같다.