4-1) 자릿수의 합

김예지·2021년 8월 27일
0

4장은 완전탐색(블루투포스)이다. 배열등의 모든 원소를 완전이 탐색하여 푸는 문제 유형이다.

문제

N개의 자연수가 입력되면 각 자연수의 자릿수의 합을 구하고, 그 합이 최대인 자연수를 출력 하는 프로그램을 작성하세요. 자릿수의 합이 같은 경우 원래 숫자가 큰 숫자를 답으로 합니다. 만약 235 와 1234가 동시에 답이 될 수 있다면 1234를 답으로 출력해야 합니다.
[입력설명]
첫 줄에 자연수의 개수 N(3<=N<=100)이 주어지고, 그 다음 줄에 N개의 자연수가 주어진다. 각 자연수의 크기는 10,000,000를 넘지 않는다.
[출력설명]
자릿수의 합이 최대인 자연수를 출력한다.

입력예제 1

7
128 460 603 40 521 137 123

출력예제 1

137


문제 풀이

예습 이론

  • 이 문제는 모두 하나씩 돌면서 탐색해야하기 때문에, 완전탐색(블루투포스)을 사용해서 풀어야 한다.
  • Math.floor(tmp/10)ParseInt(tmp/10)은 소수점을 삭제하고 정수를 리턴한다. parseInt는 앞에서 봤던 것 처럼 String을 2-36진수로 바꾸는 역할도 한다.
  • x.toString(): x를 String화 한다.
  • x.split(''): x문자를 ''로 쪼개고, 배열화한다.
  • reduce((a, b) => a + Number(b), 0): a는 누적값(초기값 0, 2번째 매개변수), b는 현재값이다. 그리고(화살표함수) a + Number(b)를 리턴한다.a=0에서 b를 계속 바꿔가며 더한다.
  • Number(answer.join('')) : answer 배열을 ''로 합친 후, Number화 한다.
  • console창에서 파란색은 숫자, 검은색은 문자이다.

코드1(내장함수 X)

코드1은 내장함수를 사용하지 않는 방법이다.
(1) for of를 통해 배열의 원소 모두를 탐색한다.
(2) 각 자리수의 합을 구한다.
(3) 가장 큰 합을 answer에 대입하여 return한다. (자릿수의 합이 같은 경우에는 큰 수를 답으로 한다)

<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <script>
            function solution(n, arr){
                let answer, max=Number.MIN_SAFE_INTEGER; 
                for(let x of arr) {
                    let sum=0, tmp=x;
                    //tmp가 0이되면 끝, 각 자릿수의 합
                    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));
        </script>
    </body>
</html>

코드2(내장함수O)

코드2는 내장함수를 사용한다.
(1) for x of arr
(2) x를 문자로 바꾼 후, split을 통해 배열화한다.
(3) 배열화된 x의 각각을 reduce 메소드를 통해 더한다. (더할 때 숫자화할것)
(3) 가장 큰 합을 answer에 대입하여 return한다. (자릿수의 합이 같은 경우에는 큰 수를 답으로 한다)

  • answer은 문자가 모인 배열의 형태이기 때문에, 이를 join을 통해 합쳐준 후 숫자화(Number)한다.
<html lang="en">
<head>
    <meta charset="UTF-8"> 
    <title>출력결과</title>
    </head>
    <body>
    <script>
        function solution(n, arr){
            let answer, max=Number.MIN_SAFE_INTEGER;
            for(let x of arr){
              x=x.toString();
              x=x.split('');
              let sum=x.reduce((a, b)=>a+Number(b), 0);
              if(sum>max){
                  max=sum;
                  answer=x;
              }
              else if(sum===max){
                  if(x>answer) answer=x;
              }
            }
            answer=Number(answer.join('')); //answer 배열의 원소를 합친 후, 숫자로 변환
            return answer;
        }
        let arr=[128, 460, 603, 40, 521, 137, 123];
        console.log(solution(7, arr));
    </script>
</body>
</html>
profile
내가 짱이다 😎 매일 조금씩 성장하기🌱

2개의 댓글

comment-user-thumbnail
2021년 9월 11일

9/11
코드2 간소화: 코드2대로 메소드를 분리해서 작성하면, x는 배열의 형태이기 때문에 문자로 변환하는 코드가 추가로 있어야 함 answer=Number(answer.join(''))
하지만, 아래코드는 불필요

<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <script>
            function solution(arr){     
                let answer, max=Number.MIN_SAFE_INTEGER; //자릿수의 합 저장(최대합)
                for(x of arr){
                    //x의 합을 메소드를 통해 구하기 
                    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(arr));
        </script>
    </body>
</html>
답글 달기
comment-user-thumbnail
2021년 9월 13일

9/13
1번 방법에서, tmp를 반드시 선언해주어야 한다. 만약 while(x)로 한다면, x는 마지막에 0이 되기 때문에, answer=x에서 answer=0이된다. 주의하기!

while(tmp){
                        sum+=(tmp%10);
                        tmp=Math.floor(tmp/10);
                    }
답글 달기