알고리즘

[JS] 알고리즘 기초 정복 4-1번_자릿수의 합

햄❤️ 2021. 7. 16. 22:00
반응형

문제 4-1번

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

 

🍄 입력설명

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

 

🍄 출력설명

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

 

🍄 입력예제 1

7

128 460 603 40 521 137 123

 

🍄 출력예제 1

137

 


정답 코드

1) reduce()로 각 자리수의 합을 구함

문자열로 바꿔서, split("")로 배열로 만든다. 배열에서 reduce함수를 통해, 각 자리수를 숫자로 변환해서 더해준다.
그렇게 해서 sum 이라는 변수에 차곡차곡 넣어주고, sum이 max보다 크면(첫번째 값인 128은 무조건 참이 되니, max는 11이 되고, answer은 128이 된다. 그 다음 수들의 합은 11보다 작거나 같기 때문에 max는 계속 11이 된다. 

function solution(arr) {
	let answer, max = Number.MIN_SAFE_INTEGER;
	for (let i = 0; i < arr.length; i++) {
		let sum = 0, tmp = arr[i];
		sum += arr[i].toString().split("").reduce((acc, cur) => acc + Number(cur), 0);
		if (sum > max) {
			max = sum;
			answer = arr[i];
		}
	}
	return answer;
}

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

 

2) 나머지로 각 자리수의 합을 구함

function solution(arr) {
	let answer, max = Number.MIN_SAFE_INTEGER;
	for (let x of arr) {
		let sum = 0, tmp = x; //임시변수 선언
        //128을 10으로 나눈 나머지는 8이 된다. sum에 누적해준다.
        //tmp인 128을 10으로 나눈 몫인 12가 tmp가 되고, 다시 10으로 나누어 나머지 2를 sum에 누적한다.
        // 몫이 0이 되는 순간 while문은 true가 되어 탈출하고 각 자리수 합을 구할 수 있다.
		while(tmp){
        	sum+=(tmp%10);
            tmp=Math.floor(tmp/10);
        }
        
		if (sum > max) {
			max = sum;
			answer = x;
		}
	}
	return answer;
}

let arr = [128, 460, 603, 40, 521, 137, 123];
console.log(solution(arr));
//128 출력
728x90
반응형