[완전 탐색][JS] 자릿수의 합

Teasan·2022년 7월 11일
0

Algorythm

목록 보기
14/17
post-thumbnail

자릿수의 합


문제 설명

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

입력 설명

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

출력 설명

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

입출력 예제

▣ 입력예제 1

  • 7
  • 128 460 603 40 521 137 123

▣ 출력예제 1

  • 137

풀이(내가 푼 문제)

function solution(n, arr) {
  let answer;
  let max = Number.MIN_SAFE_INTEGER;

  // arr 를 돌면서 각 값을 split으로 쪼개서 num에 넣어주고, ['1', '2', '8'], ['4', '6', '0'] ...
  for (let x of arr) {
    let sum = 0;
    let tmp = x;
    tmp = tmp.toString().split("");
    for (let y of tmp) {
      sum += Number(y);
    }
    if (sum > max) {
      max = sum;
    }
  }

  answer = max;
  return answer;
}

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

출력

  • 11 (실패)

풀이(내가 푼 문제) / 복습

function solution(n, arr) {
  let answer;
  let max = Number.MIN_SAFE_INTEGER;

  /**
   * 각 배열의 숫자들을 자릿수마다 더해준다.
   * x 를 돌면서 각 값을 문자열화 해서,
   * split으로 쪼개서 num에 넣어주고,
   * ['1', '2', '8'], ['4', '6', '0'] ...
   */
  for (let x of arr) {
    let sum = arr
      .toString()
      .split("")
      .reduce((a, b) => a + Number(b));

    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

풀이 순서

  • 먼저 arrfor ...in 문으로 돌고,
for (let x of arr) {
}
  • arr를 문자열로 변환한 뒤, split('')로 쪼깨서 배열로 반환하고, reduce()로 자릿수가 모두 더해질 수 있도록 한다. 더해질 때 숫자로 더해질 수 있도록 bNumber() 메소드로 문자열에서 숫자로 변환한 것을 sum 변수에 할당한다.
for (let x of arr) {
  let sum = arr
    .toString()
    .split("")
    .reduce((a, b) => a + Number(b));
}
  • 가장 큰 값을 구해야 하기 때문에 최대값을 구하기 위한 임의의 변수 max를 설정한다.
let max = Number.MIN_SAFE_INTEGER;
  • 그리고 우리가 계산한 sum 결과값이 임의의 최대값 max 보다 크다면, 해당 summax로 할당할 수 있도록 했다. 또한, 그 최대값에 해당하는 원본 배열 arr의 요소 x 값을 answer에 할당한다.
for (let x of arr) {
  let sum = arr
    .toString()
    .split("")
    .reduce((a, b) => a + Number(b));

  if (sum > max) {
    max = sum;
    answer = x;
  }
}
  • summax가 동일할 경우(똑같은 결과 값이 있을 때)를 처리해주어야 한다. 이때는 만약 위에서 위에서 할당한 answer 값이 원본 배열 arr의 요소인 x 보다 작다면, (x가 더 크다면) answerx를 할당하도록 했다.

해답/풀이(강의) 1

function solution(n, arr) {
  let answer;
  let max = Number.MIN_SAFE_INTEGER;

  for (let x of arr) {
    let sum = 0;
    let 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

해답/풀이(강의) 2

function solution(n, arr) {
  let answer;
  let 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

수도 코드 포함

function solution(n, arr) {
  let answer;
  let max = Number.MIN_SAFE_INTEGER;

  for (let x of arr) {
    /**
     * 각 배열의 숫자들을 자릿수마다 더해준다.
     * x 를 돌면서 각 값을 문자열화 해서,
     * split으로 쪼개서 num에 넣어주고,
     * ['1', '2', '8'], ['4', '6', '0'] ...
     */
    let sum = x
      .toString()
      .split("")
      .reduce((a, b) => a + Number(b), 0);

    // 만약 sum이 max 보다 크다면
    if (sum > max) {
      // max는 sum이 되고, (가장 큰 값이 들어감)
      max = sum;
      // 이때 마지막으로 가장 큰 값이 max가 될 때
      // answer에 해당 배열 요소 x를 할당한다.
      answer = x;

      // 만약 동일한 결과 값이 있다면,
    } else if (sum === max) {
      // 그리고 만약 answer 결과 값보다 x(원래 값)가 크다면 그게 answer로 할당.
      if (x > answer) answer = x;
      // 원본 요소가 더 큰 값을 answer에 할당한다.
    }
  }

  return answer;
}

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

⚡️ Reference


✍🏻 자바스크립트 알고리즘 문제풀이 - 인프런

profile
일단 공부가 '적성'에 맞는 개발자. 근성있습니다.

0개의 댓글