N개의 자리수가 입력되면 각 자연수의 자릿수의 합을 구하고, 그 합이 최대인 자연수를 출력하는 프로그램을 작성하세요. 자릿수의 합이 같은 경우 원래의 숫자가 큰 숫자를 답으로 한다. 만약 235와 1234가 동시에 답이 될 수 있다면, 1234를 답으로 출력해야 한다.
[128, 460, 603, 40, 521, 137, 123]
137
아래 방식은 수학적인 방식을 이용해서 문제를 푸는 방식이다. 직관적이긴 하지만, 함수에서 이렇게 값을 도출해내서 푸는 방식이 매끄럽지 못하다는 생각이 들었다.
function solution(arr) {
let answer, max=Number.MIN_SAFE_INTEGER;//max는 가장 작은 숫자로 초기화
arr.forEach(item => {
let sum = 0;
let temp = item;
while(temp) {
sum+=(temp % 10); // 나머지를 sum에 합치기
temp=Math.floor(temp/10); // 나머지의 몫 구하기
}
if (sum > max) {
max=sum;
answer=item;
}
else if (sum === max) {
if (item > answer) {
answer = item;
}
}
});
return answer;
};
const arr = [128, 460, 603, 40, 521, 137, 123];
console.log(solution(arr));

배열의 요소 각각을 spilt()메소드로 배열로 바꿔준 다음 누산기 함수를 이용해 합을 구하는 방식이다. 다만 이때 toString()로 인해 2차원 배열의 내부의 값은 모두 문자열이기때문에 합을 구하기 위해서는 반드시 숫자로 바꿔줘야 한다.
다음 아래 합과 최대값을 비교하면서 배열 내에 다른 숫자이지만 합이 값은 숫자를 걸러주는 로직을 작성한다.
function solution(arr) {
let answer, max=Number.MIN_SAFE_INTEGER;//max는 가장 작은 숫자로 초기화
arr.forEach(item => {
let sum = item.toString().split('').reduce((a, b) => a+Number(b), 0); // reduce로 요소를 sum으로 바꿔주기, 반드시 기억해두자. string 타입은 그대로 옆으로 붙는다.
if (sum > max) {
max=sum;
answer=item;
}
else if (sum === max) {
if (item > answer) {
answer = item;
}
}
});
return answer;
};
const arr = [128, 460, 603, 40, 521, 137, 123];
console.log(solution(arr));
