JS 알고리즘 문제풀이/섹션 4. 완전탐색(블루투포스)

1.자리수의 합

crab. 2022. 1. 14. 11:51
반응형

📌강의 정리

자리수의 합들을 각각 더해서 최대값을 출력하는 문제이다.

매개변수넘기기는 n을 넘겨도 배열의 길이를 넘겨도 괜찮다.

max변수는 가장 작은값이어야 하므로

Number.MIN_SAFE_INTEGER; 로 한다.

우선 숫자 자체가지고 문제를 해결한다면

sum 변수와 tmp변수를 만들어 x값을 넣어준다.

이제 tmp를 %10하고 /10하면 자리수를 더하고 자리수를 숫자에서 삭제하는 코드가 작성된다.

이때 while문을 사용한다. while(tmp)를 하면 된다.

/10을 할때는 앞에 Math.floor를 해서 소수점을 없애준다.

이후 if문으로 sum과 max를 비교하여 sum이크면 max에 sum을 대입하여 max에 계속 큰값이 들어오게 하고 answer에는 tmp의 원본값인 x를 넣어준다.

if문에는 ≥를 하면 자리수의 합이 같을때 단순히 나중값이 출력되므로

sum === max로 같을때의 비교구문을 넣어준다.

이제 문제를 다른방법으로 다시 풀어보면

내장함수를 써서 한줄로풀어낼수도 있다.

let sum=x.toString().split(''); 하면 문자열로 각각을 나눌 수 있다.

이제 reduce((a,b)⇒a+Number(b),0);뒤에 붙여주면 자리수의 합이 문자로 더해지는게 아닌 숫자로 더해질수 있다.

📌느낀점

강사님의 처음 방법은 나랑 거의 동일했다.

단지 while문을 썼느냐 안썼느냐의 차이인데 무한반복이 좀 그렇긴하지만

확신이 들때는 while문을 쓰는 것이 맞는것같다.

두번째 방법은 살짝생각만하다 내가 사용하지 않은 방법인데

문자열과 배열을 능수능란하게 오고가며 잘 풀줄 알아야 겠다.

(+)220607 추가 

새롭게 다시 풀어봤는데 어째 전보다 훨씬 시간도 오래걸리고 이상하게 풀었다..

과거에는 방향은 맞았는데 풀이가 살짝 더러웠고

지금은 방향은 살짝 틀렸지만 풀이가 깔끔하다.

(과거에는 while을 안썼다면 이번에는 while을 썼지만 일의자리를 이용한게 아닌 억지로 끝자리부터 계산해서 했다...)

열심히 해야겠다.

//220607 추가
<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function solution(n, arr) {
        let answer,
          max = Number.MIN_SAFE_INTEGER;
        let tmp = 0;
        let maxNum = 0;
        let sum = 0;
        for (let i = 0; i < arr.length; i++) {
          let targetNum = arr[i];
          while (targetNum) {
            tmp = parseInt(targetNum / 10 ** (String(targetNum).length - 1));
            targetNum -= tmp * 10 ** (String(targetNum).length - 1);
            sum += tmp;
          }
          if (sum > max) {
            max = sum;
            maxNum = arr[i];
          } else if (sum === max) {
            if (maxNum < arr[i]) maxNum = arr[i];
          }
          sum = 0;
        }
        answer = maxNum;
        return answer;
      }

      let arr = [128, 460, 603, 40, 521, 137, 123];
      console.log(solution(7, arr));
    </script>
  </body>
</html>
//나의 코드
<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <script>
            function solution(n, arr){
                let answer = 0;
                let max = 0;
                let arrSum = 0;
                let maxNum = 0;
                for(let i=0;i<n;i++){
                    console.log(arr[i]);
                    arrT = arr[i]
                    for(let j=0;j<6;j++){
                        arrSum+=arrT%10
                        arrT = Math.floor(arrT/10)
                        if(arrT === 0) break;
                    }
                    console.log(arrSum);
                    if(max<arrSum){
                        max = arrSum;
                        maxNum = arr[i];
                    }
                    else if(max === arrSum){
                        if(arr[i] > maxNum){
                            max = arrSum;
                            maxNum = arr[i];
                        }
                    }
                    arrSum = 0;
                }
                answer = maxNum;
                return answer;
            }
            
            let arr=[632, 460, 603, 40, 521, 137, 123, 128];
            console.log(solution(8, arr));
        </script>
    </body>
</html>
//강사님 코드
<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;
                    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>

<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=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(7, arr));
        </script>
    </body>
반응형

'JS 알고리즘 문제풀이 > 섹션 4. 완전탐색(블루투포스)' 카테고리의 다른 글

5.K번째 큰 수  (0) 2022.01.14
4.졸업선물  (0) 2022.01.14
3.멘토링  (0) 2022.01.14
2.뒤집은 소수  (0) 2022.01.14