자릿수의 합
문제
N개의 자연수가 입력되면 각 자연수의 자릿수의 합을 구하고, 그 합이 최대인 자연수를 출력하는 프로그램을 작성하세요. 자릿수의 합이 같은 경우 원래 숫자가 큰 숫자를 답으로 합니다. 만약 235 와 1234가 동시에 답이 될 수 있다면 1234를 답으로 출력해야 합니다.
입력설명
첫 줄에 자연수의 개수 N(3<=N<=100)이 주어지고, 그 다음 줄에 N개의 자연수가 주어진다.
각 자연수의 크기는 10,000,000를 넘지 않는다.
출력설명
자릿수의 합이 최대인 자연수를 출력한다.
입력예제
const n = 7;
const arr = [128, 460, 603, 40, 521, 137, 123];출력예제
137
나의 풀이
중요한 건 원래 숫자가 뭐였는지, 그 숫자의 자릿수의 합이 무엇인지 알고 있어야한다.
변수 생성
자릿수의 합을 저장할 변수와 origin 값을 저장할 변수를 생성한다.
let maxSumValue = 0;
let originValue = 0;배열 순회 및 자릿수 합 계산
arr을 순회하면서 기존 요소의 값과 자릿수를 합한 값을 저장한다.
arr.forEach(item => {
let sum = 0;
let current = item;
while (current > 0) {
const sumValue = current % 10;
const nextValue = Math.floor(current / 10);
sum += sumValue;
current = nextValue;
}
}Map 객체를 이용한 비교
기존에 저장되어있는 map 객체에 동일한 자릿수의 합이 있다면 숫자를 비교한다.
if (map.has(sum)) {
const currentOriginValue = map.get(sum);
if (currentOriginValue < item) {
map.set(sum, item);
return;
}
} else {
map.set(sum, item);
}결과 반환
가장 큰 자릿수의 합을 가진 요소를 리턴한다.
return [...map].sort((a, b) => b[0] - a[0])[0][1];Solution
변수 초기화
리턴하는 값(배열의 요소)과 자릿수의 최대합을 담을 변수를 생성한다.
let answer = 0;
let max = 0; // or Number.MIN_INTEGER_SAGE배열 순회 및 자릿수 합 계산
배열을 순회하며 자릿수의 합을 구한다.
for (let item of string) {
let current = item;
let sum = 0;
while (current > 0) {
sum += current % 10;
current = Math.floor(current / 10);
}
// 최대값 찾기
if (sum > max) {
// 더한 값이 기존 max 값보다 크다면 max 변경, answer 값 변경
max = sum;
answer = item;
} else if (sum === max) {
// 더한 값과 기존 max 값이 같다면 answer와 item 비교 후 answer에 큰 값 할당
answer = answer > x ? answer : x;
}
}전체 코드
function solution(n, arr) {
let max = 0;
let answer = 0;
for(let item of arr){
let current = item;
let sum = 0;
while(current > 0){
sum += current % 10;
current = Math.floor(current / 10);
}
if(sum > max){
answer = item;
max = sum;
} elss if(sum === max) {
answer = answer > x ? answer : x;
}
}
return answer;
}가공된 값과 origin 값을 가지기 위해선 Map 객체를 사용하는게 좋을 것 같다라는 생각을 먼저 하고 문제를 접근했는데 문제를 너무 어렵게 접근했던 것 같기도 합니다.