완전 탐색(블루투포스) 문제 풀이

Hyodduru ·2022년 2월 4일
0

Algorithm

목록 보기
5/25
post-thumbnail

완전 탐색(블루투포스)

1. 자릿수의 합

N개의 자연수가 입력되면 각 자연수의 자릿수의 합을 구하고, 그 합이 최대인 자연수를 출력 하는 프로그램을 작성하기. 자릿수의 합이 같은 경우 원래 숫자가 큰 숫자를 답으로 한다.

  function solution(n, arr) {
    let answer,
      max = Number.MIN_SAFE_INTEGER;
    for (let x of arr) {
      //1. while 이용하기
      //   let sum = 0,
      //   let tmp = x; //x을 바로 변형시키면 안됌. 임시변수 필요 answer에 x 원본 값을 주어야 하므로
      //   while (tmp) {
      //     sum += tmp % 10;
      //     tmp = Math.floor(tmp / 10);
      //   }

      //2. 내장함수 이용 (훨씬 간편)
      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)); //137

2. 뒤집은 소수

N개의 자연수가 입력되면 각 자연수를 뒤집은 후 그 뒤집은 수가 소수이면 그 소수를 출력하 는 프로그램을 작성하기. 첫 자리부터의 연속된 0은 무시한다.

  function isPrime(num) {
    const checkPrimes = [2, 3, 5, 7];
    for (let x of checkPrimes) {
      if (num % x === 0) {
        return false;
      } else {
        return num;
      }
    }
  }

  function solution(arr) {
    let answer = [];

    for (let x of arr) {
      let num = parseInt(x.toString().split("").reverse().join(""));

      answer.push(isPrime(num));
    }

    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 x of arr) {
  //1. while 사용하기
  let res = 0;
  while (x) {
    let t = x % 10;
    res = res * 10 + t;
    x = parseInt(x / 10);
  }

  //2. 내장함수 사용하기
        let res = Number(x.toString().split("").reverse().join(""));
        if (isPrime(res)) answer.push(res);
      }
      return answer;
    }
    let arr = [32, 55, 62, 20, 250, 370, 200, 30, 100];
    console.log(solution(arr)); //[23, 2, 73, 2, 3]

3. 멘토링

M번의 수학테스트 등수를 가지고 멘토와 멘티를 정한다.만약 A학생이 멘토이고, B학생이 멘티가 되는 짝이 되었다면, A학생은 M번의 수학테스트에서 모두 B학생보다 등수가 앞서야 한다. M번의 수학성적이 주어지면 멘토와 멘티가 되는 짝을 만들 수 있는 경우가 총 몇 가지 인지 출력하는 프로그램을 작성하기.
3412 의 경우 3번의 1등을 한 것!

  function solution(test) {
    let answer = 0;
    let m = test.length;
    let n = test[0].length; // 열의 개수 
    for (let i = 1; i <= n; i++) {
      for (let j = 1; j <= n; j++) {
        let cnt = 0;
        for (let k = 0; k < m; k++) {
          let pi = (pj = 0); //등수
          for (let s = 0; s < n; s++) {
            if (test[k][s] === i) pi = s; // i 등수
            if (test[k][s] === j) pj = s;
          }
          if (pi < pj) cnt++; // 3개의 시험에서 통과한 횟수
        }
        if(cnt === m)answer++; // 3번 다 pi <pj이어야 하므로!
      }
    }

    return answer;
  }
  let arr = [
    [3, 4, 1, 2],
    [4, 3, 2, 1],
    [3, 1, 4, 2],
  ];
  console.log(solution(arr)); //3

4. 졸업선물

배열의 개수와 상품의 가격과 배송비로 이루어진 배열의 모음을 인자로 받는다.
하나의 상품만 50% 할인받는 것이 가능하다. 배송비는 할인에 포함되지 않는다. 살 수 있는 최대한의 상품의 갯수를 구하는 프로그램 만들기.

  function solution(m, product) {
    let answer = 0;
    let n = product.length;
    product.sort((a, b) => a[0] + a[1] - (b[0] + b[1]));
    for (let i = 0; i < n; i++) {
      let money = m - (product[i][0] / 2 + product[i][1]);
      let cnt = 1;
      for (let j = 0; j < n; j++) {
        if (j !== i && product[j][0] + product[j][1] > money) break;
        if (j !== i && product[j][0] + product[j][1] <= money) {
          money -= product[j][0] + product[j][1];
          cnt++;
        }
      }
      answer = Math.max(answer, cnt);
    }
    return answer;
  }

  let arr = [
    [6, 6],
    [2, 2],
    [4, 3],
    [4, 5],
    [10, 3],
  ];
  console.log(solution(28, arr)); //4

5. K번째 큰 수

N개의 카드 중 3장을 뽑을 수 있는 모든 경우의 수를 구해 이중 K번째로 큰 수를 출력하는 프로그램을 만들어라.

  //나의 풀이
  function solution(n, k, card) {
    let answer = 0;
    let sums = [];

    for (let i = 0; i < n; i++) {
      for (let j = 1; j < n; j++) {
        let sum = 0;
        for (let k = 2; k < n; k++) {
          sum = arr[i] + arr[j] + arr[k];
        }
        sums.push(sum);
      }
    }
    sums.sort((a, b) => b - a);
    const setSums = new Set(sums);

    console.log(setSums);
    answer = setSums[k - 1];
    return answer;
  }

  //선생님 풀이
  function solution(n, k, card) {
    let answer;
    let tmp = new Set(); // set이라는 객체를 만들어주자
    for (let i = 0; i < n; i++) {
      for (let j = i + 1; j < n; j++) {
        for (let k = j + 1; k < n; k++) {
          tmp.add(card[i] + card[j] + card[k]);
        }
      }
    }

    let a = Array.from(tmp).sort((a, b) => b - a);
    answer = a[k - 1];
    return answer;
  }

  let arr = [13, 15, 34, 23, 45, 65, 33, 11, 26, 42];
  console.log(solution(10, 3, arr)); //143
  

⭐️ 핵심 포인트 set => 중복을 제거하자

profile
꾸준히 성장하기🦋 https://hyodduru.tistory.com/ 로 블로그 옮겼습니다

0개의 댓글