코딩테스트 문제풀이/inflearn

[인프런] Node.js / 섹션4 - 완전탐색(브루트포스) / 1. 자릿수의 합

sangchu 2023. 1. 19. 11:20

각 자연수의 자릿수의 합을 구하고, 그 합이 최대인 자연수를 출력

자릿수의 합이 같은 경우 원래 숫자가 큰 숫자가 답

 

나의 풀이

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

  for (let x of arr) {
  	// 각 자릿수 합 구하기
    sum = x
      .toString()
      .split("")
      .reduce((a, b) => a + Number(b), 0);
	// 각 자릿수 합 구한게 최대합과 같고, 현재 숫자가 정답으로 친 숫자보다 크면 현재 숫자를 답으로
    if (sum === numSumMax && x > answer) {
      answer = x;
    } else if (sum > numSumMax) { // 각 자릿수 합이 최대합보다 크면
      numSumMax = sum;
      answer = x;
    }
  }

  return answer;
}

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

 

원래는 각자리 숫자 합을 reduce라는걸 잊었어서 for문으로 돌았다.

다 풀고 강사님 코드를 참고하면서 기억이 났다.

계속 잊어버려서 이러한 메서드들은 따로 정리할 필요성을 느꼈다...

 

강사 풀이

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));

강사님은 각자리수 합을 따로 문자열로 변형해서 풀 필요 없이 5~8번째 줄과같이 while문을 통해 구하셨다.

10으로 나누면서 각 자릿수를 구하고, 다 나누면 나머지값이 0이므로 반복문을 빠져나가게 되는걸 이용하셨다.