Lv 2. 소수 찾기

박하린·2021년 6월 19일
0

프로그래머스

목록 보기
31/42

📚 문제

완전 탐색 - 소수 찾기
https://programmers.co.kr/learn/courses/30/lessons/42839

💡 접근

  1. 가능한 모든 숫자를 뽑아서
  2. 소수판별을 하고 소수인것만 중복을 걸러주는 set집합에 넣고 set의 size를 반환해준다.

대략 어떻게 풀어야하는지 생각은 나는데 코드로 옮기는게 정말 쉽지 않았다 ㅠ
그래서 자료를 많이 찾아보고 이해하는 식으로 공부했다.

1번을 코드로 구현하는 데는 순열 알고리즘을 찾아서 로직을 이해하고 적용하였다..
순열 알고리즘은 잘 알아놔야겠다

순열 알고리즘 참고한 곳 : 설명이 자세하다

⌨️ 코드

function solution(numbers) {
  // 배열로 쪼갬
  numbers = numbers.toString().split("");

  // 중복을 제거한 소수만 담기위해
  const set = new Set();

  // 1자리수 부터 numbers의 길이 자리수 까지 순열 연산
  for (let i = 1; i <= numbers.length; i++) {
    const answer = getpermutation(numbers, i);
    // console.log(answer)
    answer.forEach((v) => {
      // 순열 연산으로 구한 배열을 join하여 숫자로 만들어준다.
      const num = Number(v.join(""));

      // 소수 구별위한 변수 초기화
      let isPrime = true;

      for (let i = 2; i <= Math.sqrt(num); i++) {
        if (num % i == 0) {
          isPrime = false; // 소수가 아니면 false
          break;
        }
      }

      if (isPrime && num > 1) set.add(num); // isPrime이 참이면서 1보다 큰 수(1은 소수가 아니기 때문에) 이면 소수이기때문에 set에 추가
    });
  }
  return set.size; // set 객체의 원소 수 = 소수의 개수
}

// 순열 알고리즘
function getpermutation(arr, n) {
  let result = [];

  if (n == 1) return arr.map((v) => [v]);
  arr.forEach((fixed, idx, origin) => {
    let restArr = origin.filter((_, i) => i != idx); // fixed를 제외한 배열
    let permutationArr = getpermutation(restArr, n - 1); // 나머지에서 순열을 구한다
    let attached = permutationArr.map((p) => [fixed, ...p]); // 구한 순열에다가 fixed 붙이기
    result.push(...attached);
  });

  return result;
}

📝 리뷰

2단계 넘어오면서 코드로 구현하는 과정이 너무 어려워졌다...ㅜㅜ
이 문제도 몇번 건드려보다가 포기하고 다시 풀고 포기하고 다시풀고 반복하다가 오늘 풀긴했는데 처음 풀 때 순열 알고리즘과 solution함수를 잘 연결했으면 그 때 풀었을 것같긴하다

profile
깃허브: https://github.com/khakaa

0개의 댓글

관련 채용 정보