인프런 커뮤니티 질문&답변

tmdwhd319님의 프로필 이미지
tmdwhd319

작성한 질문수

자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)

1. 자리수의 합

코드리뷰 부탁드립니다!

작성

·

116

0

// 자릿수끼리의 합이 제일 많은 것을 출력.
// 같은 경우 원래 숫자가 더 높은 쪽을 출력

function solution(n = 0, arr = []) {
  let answer = 0;
  let max = Number.MIN_SAFE_INTEGER;
  const splitNums = arr.map((val) => (val + "").split(""));
  for (let i = 0; i < splitNums.length; i++) {
    const temp = splitNums[i].reduce((prev, cur) => +prev + +cur, 0);
    if (temp > max) {
      max = temp;
      answer = arr[i];
    } else if (temp === max) answer = arr[i];
  }

  return answer;
}

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

혼자 풀어봤습니다..

for문 안에 배열 메서드가 들어가는게 좀 이상한 것 같은데 이렇게 써도 무방한지 여쭙고싶습니다.

혹은 수정할 점이 있다면 조언해주시면 감사하겠습니다!

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

코드를 보면 자릿수의 합을 구하고 그중 가장 큰 값을 찾으려고 하시는 것으로 보입니다. 제시해 주신 코드는 이미 잘 작성되어 있으며, 자릿수끼리의 합을 구하기 위해 배열 메서드인 map, split, reduce를 적절히 활용하셨습니다. 이렇게 배열 메서드를 활용하는 것은 자바스크립트에서 일반적이고 추천되는 패턴입니다. 따라서 for문 안에서 배열 메서드를 사용하는 것도 전혀 이상하지 않습니다.

하지만 약간의 개선점을 말씀드리자면, 같은 자릿수 합을 가진 숫자들 중 원래 숫자가 더 높은 쪽을 선택하는 로직에서 else if (temp === max) answer = arr[i]; 부분이 잘못되었습니다. 이 코드는 같은 최대 합을 가진 숫자가 있을 때, 마지막으로 발견된 숫자로 answer를 업데이트하게 합니다. 조건에 따라 원래 숫자가 더 높은 쪽을 선택해야 하므로, 이 부분을 else if (temp === max && arr[i] > answer) answer = arr[i];로 수정하는 것이 좋겠습니다.

수정된 코드는 다음과 같습니다:

function solution(n = 0, arr = []) {
  let answer = 0;
  let max = Number.MIN_SAFE_INTEGER;
  const splitNums = arr.map((val) => (val + "").split(""));
  for (let i = 0; i < splitNums.length; i++) {
    const temp = splitNums[i].reduce((prev, cur) => +prev + +cur, 0);
    if (temp > max) {
      max = temp;
      answer = arr[i];
    } else if (temp === max && arr[i] > answer) answer = arr[i]; // 수정된 부분
  }

  return answer;
}

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

이렇게 수정하면 같은 자릿수 합을 가진 숫자들 중에서도 원래 숫자가 더 높은 쪽을 올바르게 출력할 수 있습니다. 코드를 작성하시는 데 있어서 더 궁금한 점이 있으시면 언제든지 질문해주세요!

tmdwhd319님의 프로필 이미지
tmdwhd319

작성한 질문수

질문하기