
N개의 자연수가 입력되면 각 자연수의 자릿수의 합을 구하고, 그 합이 최대인 자연수를 출력 ( 단, 합이 같으면 더 큰 자연수를 출력하라 )
function solution(n, arr) {
let answer, max = Number.MIN_SAFE_INTEGER;
for(let x of arr) {
let sum = 0, tmp = x;
while(tmp) {
sum += tmp % 10;
tmp = Math.floor(tmp/10);
}
if(sum>max) {
max = sum;
answer = 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)); // 137
x값이 변하면 안되기 때문에 tmp에 x 복사
tmp를 10으로 나눈 나머지를 통해 일의 자리를 구하고, 그 몫을 tmp로 재할당 해주면 일의 자리를 뺀 나머지 숫자가 나오게 된다.
tmp가 0이 될 때까지 반복하면 차례로 일의 자리, 십의 자리, 백의 자리 숫자를 구할 수 있다.
조건문을 통해 max보다 큰 sum을 max로 재할당
조건문을 통해 자릿수의 합이 같은 경우, 현재 for문을 돌고 있는 x와 answer에 담긴 이전의 x를 비교하여 숫자가 더 큰 경우를 answer에 할당
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;
}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)); // 137
while문을 reduce()를 이용해 한 줄로 축약
x.toString().split('')을 통해 배열의 요소 하나를 쪼갠다.
ex) 128 → ['1', '2', '8'], 40 → ['4', '0']
array.reduce()를 통해 쪼개진 배열을 순회하여 누적해준다. 여기서 배열의 요소들은 string이기 때문에 Number로 바꿔주어 누적