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));