본문 바로가기
Algorithm/JavaScript

[완전탐색] 자릿수의 합

by _sweep 2021. 12. 13.

자바스크립트 알고리즘 문제풀이 강의를 듣고 정리한 내용입니다.

 

 

 

 

📋 문제

N개의 자연수가 입력되면 각 자연수의 자릿수 합을 구하고 그 합이 최대인 자연수를 출력한다.

자릿수의 합이 같은 경우 기존 자연수가 큰 수가 답이 된다.

만약 236과 1235가 있다면 이 둘의 자릿수 합은 11로 동일하지만 1235가 더 큰 수 이므로 1235가 답이 된다.

 

 

👉 입력

N개의 자연수가 주어진다.

 

 

👈 출력

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

 

 

📝 풀이

 

function solution(arr) {
    let answer = 0, max = Number.MIN_SAFE_INTEGER;
    let temp;
    for (const a of arr) {
        temp = 0;
        for (const s of String(a)) {
            temp += Number(s);
        }
        if (temp >= max && answer < a) {
            max = temp;
            answer = a;
        }
    }
    return answer;
}

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

 

주어진 배열 arr의 요소들을 순회하면서 요소들을 하나씩 쪼개고 그 수를 더해야 한다.

숫자를 그대로 10씩 나눠가면서 더할 수도 있겠지만 문자형으로 다루는 것이 더 편해서 각 요소를 순회할 때마다 해당 요소를 문자형으로 바꾼 뒤, 쪼개진 것들을 다시 숫자형으로 바꾸어 더해주었다.

 

그러니까 안쪽 for문에서는 128 -> '1', '2', '8' -> 1 + 2 + 8이라는 작업이 이루어지는 것이다.

 

이후 if문에서 현재 값이 이전 값 중 최댓값보다 크고 기존의 자연수가 저장해둔 값보다 크면 max를 현재 값으로, answer를 기존의 자연수로 바꾼다.

 

이러한 과정을 거치면 answer에는 자릿수의 합이 동일한 것 중 제일 값이 큰 자연수가 담기게 된다.

 

 

function solution(arr) {
  let answer, max = Number.MIN_SAFE_INTEGER;
  for (const a of arr) {
    let sum = 0, temp = a;
    while (temp) {
      sum += temp % 10;
      temp = Math.floor(temp / 10);
    }
    if (sum >= max) {
      max = sum;
      answer = answer > a ? answer : a;
    }
  }
  return answer;
}

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

 

이 코드는 위와 동일하지만 기존 자연수를 문자형으로 바꾸지 않고 숫자로만 처리하는 방식이다.

 

 

function solution(arr) {
    let answer, max = Number.MIN_SAFE_INTEGER;
    for (const a of arr) {
        let sum = a.toString().split('').map(Number).reduce((a, b) => a + b)
        if (sum >= max) {
            max = sum;
            answer = answer > a ? answer : a;
        }
    }
    return answer;
}

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

 

이 코드는 맨 위의 코드와 동일한 로직이지만 코드의 길이는 더 짧다.

arr의 각 요소를 문자형으로 바꾸어 값을 계산하는 것은 동일하다.

총합을 구하는 과정만 reduce()를 사용한 것이다.

다음부터는 누적값을 구할 때 reduce()를 한 번씩 떠올려보는 것도 좋을 것 같다.

 

 

 

 

 

'Algorithm > JavaScript' 카테고리의 다른 글

[완전탐색] 멘토링  (0) 2021.12.13
[완전탐색] 뒤집은 소수  (0) 2021.12.13
[문자열탐색] 문자열 압축  (0) 2021.12.10
[문자열탐색] 가장 짧은 문자거리  (0) 2021.12.10
[문자열탐색] 숫자만 추출  (0) 2021.12.10

댓글