(알고리즘) 자릿수의 합

호두파파·2022년 1월 24일
0

알고리즘 연습

목록 보기
45/60
post-thumbnail

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

입력예제

[128, 460, 603, 40, 521, 137, 123]

출력예제

137

각 자리의 합을 도출해서 문제 푸는 방식

아래 방식은 수학적인 방식을 이용해서 문제를 푸는 방식이다. 직관적이긴 하지만, 함수에서 이렇게 값을 도출해내서 푸는 방식이 매끄럽지 못하다는 생각이 들었다.

function solution(arr) {
  let answer, max=Number.MIN_SAFE_INTEGER;//max는 가장 작은 숫자로 초기화
  arr.forEach(item => {
    let sum = 0;
    let temp = item;
    while(temp) {
      sum+=(temp % 10); // 나머지를 sum에 합치기 
      temp=Math.floor(temp/10); // 나머지의 몫 구하기
    }
    if (sum > max) {
      max=sum;
      answer=item;
    }
    else if (sum === max) {
      if (item > answer) {
        answer = item;
      }
    }
  });
  return answer;
};

const arr = [128, 460, 603, 40, 521, 137, 123];

console.log(solution(arr));


내장함수를 이용해서 배열의 요소 합 구하기

배열의 요소 각각을 spilt()메소드로 배열로 바꿔준 다음 누산기 함수를 이용해 합을 구하는 방식이다. 다만 이때 toString()로 인해 2차원 배열의 내부의 값은 모두 문자열이기때문에 합을 구하기 위해서는 반드시 숫자로 바꿔줘야 한다.

다음 아래 합과 최대값을 비교하면서 배열 내에 다른 숫자이지만 합이 값은 숫자를 걸러주는 로직을 작성한다.

function solution(arr) {
  let answer, max=Number.MIN_SAFE_INTEGER;//max는 가장 작은 숫자로 초기화
  arr.forEach(item => {
    let sum = item.toString().split('').reduce((a, b) => a+Number(b), 0); // reduce로 요소를 sum으로 바꿔주기, 반드시 기억해두자. string 타입은 그대로 옆으로 붙는다. 
    if (sum > max) {
      max=sum;
      answer=item;
    }
    else if (sum === max) {
      if (item > answer) {
        answer = item;
      }
    }
  });
  return answer;
};

const arr = [128, 460, 603, 40, 521, 137, 123];

console.log(solution(arr));

profile
안녕하세요 주니어 프론트엔드 개발자 양윤성입니다.

0개의 댓글