far

[JS 알고리즘] 자릿수의 합 본문

알고리즘/알고리즘 베이스

[JS 알고리즘] 자릿수의 합

Eater 2023. 3. 26. 03:27

자릿수의 합

N개의 자연수가 입력되면 각 자연수의 자릿수의 합을 구하고, 그 합이 최대인 자연수를 출력하는 프로그램을 작성하세요. 자릿수의 합이 같은 경우 원래 숫자가 큰 숫자를 답으로 합니다. 만약 235 와 1234가 동시에 답이 될 수 있다면 1234를 답으로 출력해야 합니다.

 

입력설명
첫 줄에 자연수의 개수 N(3<=N<=100)이 주어지고, 그 다음 줄에 N개의 자연수가 주어진다.
각 자연수의 크기는 10,000,000를 넘지 않는다.

 

출력설명
자릿수의 합이 최대인 자연수를 출력한다.

 

입력예제
128 460 603 40 521 137 123

 

출력예제
137

 

// 나의 풀이

function solution(n, arr){
    let answer = 0;
    let prev = 0;
    let num = 0;

    for (let i of arr) {
        let str = i.toString()
        for (let j = 0; str.length > j; j++) {
            prev += parseInt(str[j])
        }
        if (prev >= num) {
            num = prev
            answer = i
        } else if (prev === num && i > answer) {
            answer = i
        }
        prev = 0
    }

    return answer;
}

let arr=[128, 460, 603, 40, 521, 137, 123];
console.log(solution(7, arr));

for...of문 이후 i를 문자열로 변환해서 다시 반복문을 돌리고 숫자 변환 후 계산하는 방식으로 풀었다.

// 강의의 풀이 1

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); // 10으로 나눠서 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));

수학적인 계산으로 푸는 방법을 사용했다. tmp%10을 사용하면 일의 자리 숫자만 남게 되고 Math.floor(tmp/10)을 사용하면 십의자리 이상인 숫자만 남게 되기 때문에 쉽게 합을 구할 수 있다.

// 강의의 풀이 2

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

문자열 변환 이후 split으로 잘라서 reduce로 합계를 구하는 방법이다. 풀이를 보니까 이게 가장 많이 사용하는 공식이 아닐까 싶다.

Number를 current값 넣는 부분에다 적용 시키면 number타입으로 변환이 가능한 것 같다.

Comments