ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [04.완전탐색] 자리수의 합
    알고리즘 2022. 4. 3. 22:00

    문제

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

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

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

    입력예제 1
    7
    128 460 603 40 521 137 123

    출력예제 1 137


    결과

    O

    내가 푼 방식 

    const solution = (array) => {
      let max = 0;
      let maxIdx = 0;
      for(let i = 0; i < array.length; i++) {
        let str = array[i].toString();
        let sum = 0;
        for(let key of str) {
          sum = sum + Number(key);
        }
        if(sum > max) {
        	max = sum
          	maxIdx = i;
        }
        if(sum === max) {
          maxIdx = (array[maxIdx] > array[i]) ? maxIdx : i
        }
      }
      return array[maxIdx]
    }

    접근과정

    1. 매개 변수로 받는 배열을 탐색하기 위한 1차 반복문 그리고 해당 인덱스의 값의 각 자리수의 총합을 구하기 위한 2차 반복문을 돌려야 한다.
    2. max값을 위한 변수를 설정하고 각 자리수의 총합이 같을 때 그 두 수의 원래 값의 비교를 위한 해당 인덱스를 넣는 maxIdx도 변수로 설정한다.
    3. 1차 반복문을 돌리고 그 안에 반복문으로 각 자리수의 총합을 sum을 구하고 sum이 max보다 클 때 max에 sum을 할당한다.
    4. sum과 max가 같을 때 해당 두 수의 원래 값을 비교하기 위해 array[maxIdx]의 값과 array[i]값을 비교하여 더 큰 값을 maxIdx에 할당한다.
    5. return할 값은 제일 큰수의 원래 값이므로 array[maxIdx]를 리턴한다.

     


    모범답안

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

    리뷰

    댓글

Designed by Tistory.