완전탐색

야 나 개 ·2021년 12월 13일
0
post-thumbnail

딱히 방법이 떠오르진 않을땐 처음부터 전부 다 해봐!!
진짜 정답을 확실하게 맞출순 있어

무작정 문제 풀어보면서 생각해보자

1번 문제

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

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

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

▣ 입력예제
[128, 460, 603, 40, 521, 137, 123]

▣ 출력예제
137

위 문제는 딱히 이진트리나 그런 방법이 안통한다.
완전탐색을 통해서 답을 확실히 찾아야 함

문제 원리

각자리수 더하는 방법은 10으로 나눈 나머지를 계속 더해주면 된다.

혹은

내장함수를 이용해서 배열의 요소를 배열로 바꾸고 또 리듀서를 한다.!!

첫번째 정답코드

function solution(arr){
  let answer
  // 최대값을 비교 하기 위해 자바스크립트에서 가장 작은수를 지정한다.
  let max=Number.MIN_SAFE_INTEGER;
                 
  for (let el of arr){
    let sum = 0
    let tmp = el;
    // 각자리수 더하는 방법
    // 나머지가 0이 되면 멈춘다.
     while(tmp){
      sum += (tmp % 10);
      tmp = parseInt(tmp / 10);
     }
    // 더한 숫자를 비교하는 방법 
    if(sum > max){
       max = sum; 
      // 진짜 원하는건 배열의 요소
       answer = el;
     // 값이 더한 값이 같을때는 요소의 숫자가 큰걸 리턴해라 
     } else if (sum === max){
         if(el > answer) {
             answer = el;
         }
     }
                
   }
    return answer;
}

두번째 정답코드

내장함수를 이용하기

function solution(arr){
  let answer
  // 최대값을 비교 하기 위해 자바스크립트에서 가장 작은수를 지정한다.
  let max=Number.MIN_SAFE_INTEGER;
                 
  for (let el of arr){
    let sum = el.toString().split('').reduce((acc,cur) => acc + Number(cur),0);
    // 더한 숫자를 비교하는 방법 
    if(sum > max){
       max = sum; 
      // 진짜 원하는건 배열의 요소
       answer = el;
     // 값이 더한 값이 같을때는 요소의 숫자가 큰걸 리턴해라 
     } else if (sum === max){
         if(el > answer) {
             answer = el;
         }
     }
                
   }
    return answer;
}

2번문제

N개의 자연수가 입력되면 각 자연수를 뒤집은 후 그 뒤집은 수가 소수이면 그 소수를 출력하는 프로그램을 작성하세요. 예를 들어 32를 뒤집으면 23이고, 23은 소수이다. 그러면 23을 출력한다. 단 910를 뒤집으면 19로 숫자화 해야 한다. 첫 자리부터의 연속된 0은 무시한다.

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

▣출력설명첫 줄에 뒤집은 소수를 출력합니다. 출력순서는 입력된 순서대로 출력합니다.

▣입력예제
932 55 62 20 250 370 200 30 100

▣출력예제
123 2 73 2 3

생각하자

  1. 숫자를 뒤집는 방법을 생각해보자
    십진수인 수는 10으로 나누면 일의자리는 항상 나머지가 된다.
    그렇다면 계속 반복시키고 앞으로 보내면 될듯

  2. (혹은) 내장함수를 이용해서 배열을 이용해서 뒤집어 보자

  3. 뒤집어진 수들은 소수인지 판정해서 그 수를 결과배열에 넣어준다.

  4. 소수인지 판정하는 방법은 자기 자신외 나눠 떨어지면 소수 이다.
    -> 판정 방법은 함수를 만들어서 해보자

첫번째 정답코드

function isPrime(num){
if(num === 1) return false;
for(let i = 2; i <= parseInt(Math.sqrt(num)) ; i++) {
   if(num % i === 0) return false;
}
return true;
}
function solution(arr){
let answer = [];
for(let el of arr){
  let result = 0;
  while(el){
  let t = el % 10;
  result = result * 10 + t
  el = parseInt(el / 10)
  }
 if(isPrime(result)) answer.push(result);
}
 return answer;
}

두번째 정답코드

내장함수를 이용하는 방법

function isPrime(num){
if(num === 1) return false;
for(let i = 2; i <= parseInt(Math.sqrt(num)) ; i++) {
   if(num % i === 0) return false;
}
return true;
}
function solution(arr){
let answer = [];
for(let el of arr){
  let result = Number(el.toString().split('').reverse().join(''));
  if(isPrime(result)) answer.push(result);
}
 return answer;
}

3번문제

멘토링

profile
야 나도 개발자 될 수 있어

0개의 댓글