[완전 탐색] 자릿수의 합

jinny·2021년 9월 30일

Algorithm

목록 보기
27/34
post-thumbnail

N개의 자연수가 입력되면 각 자연수의 자릿수의 합을 구하고, 그 합이 최대인 자연수를 출력 ( 단, 합이 같으면 더 큰 자연수를 출력하라 )

1. while 문

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);
        }
      
        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)); // 137
  • x값이 변하면 안되기 때문에 tmp에 x 복사

  • tmp를 10으로 나눈 나머지를 통해 일의 자리를 구하고, 그 몫을 tmp로 재할당 해주면 일의 자리를 뺀 나머지 숫자가 나오게 된다.

  • tmp가 0이 될 때까지 반복하면 차례로 일의 자리, 십의 자리, 백의 자리 숫자를 구할 수 있다.

  • 조건문을 통해 max보다 큰 sum을 max로 재할당

  • 조건문을 통해 자릿수의 합이 같은 경우, 현재 for문을 돌고 있는 x와 answer에 담긴 이전의 x를 비교하여 숫자가 더 큰 경우를 answer에 할당




2. Array.reduce()

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));  // 137
  • while문을 reduce()를 이용해 한 줄로 축약

  • x.toString().split('')을 통해 배열의 요소 하나를 쪼갠다.
    ex) 128 → ['1', '2', '8'],   40 → ['4', '0']

  • array.reduce()를 통해 쪼개진 배열을 순회하여 누적해준다. 여기서 배열의 요소들은 string이기 때문에 Number로 바꿔주어 누적

profile
주니어 개발자의 기록

0개의 댓글