2022/01/11) 1. 자릿수의 합 [완전탐색(블루투포스)]

굥굥이·2022년 1월 11일
0
post-thumbnail

1. 문제

<자릿수의 합>
: N개의 자연수가 입력되면 각 자연수의 자릿수의 합을 구하고, 그 합이 최대인 자연수를 출력하는 프로그램을 작성한다. 자릿수의 합이 같은 경우 원래 숫자가 더 큰 숫자를 답으로 한다. 만약 235와 1234가 동시에 답이 될 수 있다면 더 큰 값인(자릿수랑 상관X) 1234가 답이 되어야 한다.

2. 해결 방법

  1. 첫 번째 방법 : 직접 while문 돌리면서 푼다. x의 원래값을 잃으면 안되므로, 새 변수를 선언해야 한다는 거 명심!
  2. 두번 째 방법 : 배열내장객체함수 이용해서 푼다. reduce를 이용해서 sum을 구해줄 건데, 먼저 reduce는 배열 내장 함수다. 그러므로 배열로 만들려면 split를 이용하면 되는데, split는 문자열을 분할하는 메서드라 toString()을 한 후 하도록 한다.
    한 번 정리해보자. 먼저 for..of에서 x값은 number타입이다.(배열에서 숫자타입으로 돼 있으니 당연하겠지) x.toString().split('').reduce((a,b) => a+Number(b),0) !
    b를 number타입으로 변환시켜줘야하는거 명심!
  3. 어떤 방법이든 꼭 answer엔 sum이 아닌 x(원래꺼)를 넣어 줘야 한다는 걸 명심!!!

! 플러스 개념!

  • String(x)x.toString()의 차이는, 둘 다 숫자를 문자열로 변환하는 기능을 하지만, toString()는 Number메서드라는 것이다.
  • 타입이 헷갈릴 땐 console.log(type of x);를 해서 확인해보자.

3. 정답

        <script> //while문으로 직접 자릿수
            function solution(n, arr){
                let answer, max = Number.MIN_SAFE_INTEGER;
                for(let x of arr){
                    let sum = 0, tmp = x; //x원본 지키기
                    while(tmp){
                        sum += (tmp%10); //나머지
                        tmp = Math.floor(tmp/10); //몫
                    }                
                    if(sum>max){
                        max = sum;
                        answer = x; //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>
        <script> //배열 내장 함수
            function solution(n, arr){
                let answer, 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; //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>

4. 내 코드와 비교 그리고 반성과 칭찬

야호 드디어 블루투포스를 배우는구나!!(사실 뭔지 모름ㅋㅋ) 얼른 꾸준히 해서 DFS, BFS도 뭔지 배우고 싶다!!! 영화스포는 잘만 보면서 이런 건 미리 안봄. 이유는 기대감을 더 가지기 위해서! 그리고 로직은 이제 대강 짤 줄 아는데, 조건문을 어설프게 쓰는 거 같다.

profile
아자아자 파이띵굥!

0개의 댓글