관리 메뉴

꿈꾸는 개발자

완전탬색-(JS) 본문

알고리즘-js(개념+정형화된 코드)

완전탬색-(JS)

rickysin 2023. 6. 16. 15:58

완전탐색은 말 그대로 완전하게 모든 것을 탐색한다는 의미이다. 영어로는 "Brute Force"라고 부르는 데 무식하게 한다? 란 란 의미로 사용되고 있다. 예로 들어서 4자리 수의 비밀번호를 풀어내기 위한 가장 무식한 방법으로는 0000~9999까지 모든 가능한 경우의 수를 다 시도해보는 것이다. 

 

대부분의 문제를 완전탐색으로 풀 수도 있게지만, 컴퓨터과학에서 중요하게 생각하는 건 무엇보다 사용된 알고리즘의 "적절성""효율성"이다. 다른 더 좋은 알고리즘 기법이 있음에도 불구하고 오나탐을 사용하는 것은 엄청난 낭비이기 때문에 추천되진 않는다. 

 

또, 알고리즘 문제 풀이, 코테 등에선 시간 복잡도를 고려해야 하기 때문에 완탐으로 풀 경우 제한을 초과하는 경우도 발생하기 때문에 항상 문제와 시간 복잡도 등을 고려해서 풀어야 한다. 

 


각설하고, 알고리즘 강의에서 나온 완탐 문제 중 하나를 코드와 함께 설명하려고 한다. 

문제

자릿수의 합

 

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

 

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

 

  • 내가 작성한 코드
      function solution(n, arr) {
        let ans = 0;
        let max = 0;
        for (let i = 0; i < n; i++) {
          let num = arr[i]
            .toString()
            .split("")
            .reduce((accu, pre) => {
              return accu + Number(pre);
            }, 0);
          if (num > max) {
            max = num;
            ans = arr[i];
          }
          if (num === max) {
            ans = ans < arr[i] ? arr[i] : ans;
          }
        }
        return ans;
      }
      let arr = [128, 460, 603, 40, 521, 137, 123];
      console.log(solution(7, arr));

위 코드에선 for문을 돌려 각 배열에 있는 숫자 합을 구한 방식으로 처리를 했다. 하지만 위의 방식보단 JS에서 제공하는 for(let x of arr) 방식으로 처리했으면 더? 좋은 것은 모르겠으나 하나의 방법이라고 생각한다.