5일차 → 소수 만들기(소수 판별식)
본문 바로가기
항해 중/2주차 알고리즘(프로그래머스)

5일차 → 소수 만들기(소수 판별식)

by 은돌1113 2021. 11. 12.

문제 설명

주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 한다.

숫자들이 들어있는 배열 nums가 매개변수로 주어질 때 nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하세요.

 

제한사항

- nums에 들어있는 숫자의 개수는 3 이상, 50개 이하입니다.

- nums의 각 원소는 1 이상, 1,000 이하의 자연수이며, 중복된 숫자는 들어있지 않습니다.

 

문제 해석

문제를 봤을 때 고려해야 하는 부분은 2가지였다.

1) (서로 다른 수) 세 개를 구한다.

2) 더해서 새로운 배열에 담는다.

3) 소수가 되는 경우의 수를 구한다. (소수가 되지 않는 숫자의 개수를 구했다.)
- 1보다 작거나 같으면 안된다.

- 2부터 N-1까지 반복하며 나누어 떨어지는지 확인 해야 한다.

4) 새로운 배열의 개수 - 소수가 되지 않는 숫자의 개수

 

내가 푼 문제 풀이

function solution(nums) {
    
    let answer = 0;
    let decArr = []
    let count = 0
    
    // # 서로 다른 숫자 3개를 뽑는다.
    nums.forEach((item, i)=>{ // 첫번째 숫자
      for(let j = i+1; j<nums.length; j++){ // 두번째 숫자
        for(let z = j+1; z<nums.length; z++){ // 세번째 숫자
          // # 더한다.
          let decCheck = nums[i] + nums[j] + nums[z]
          // # 새로운 배열에 담는다
          decArr.push(decCheck)
        }
      }
    })

    // # 소수를 찾기 위한 반복문
    decArr.forEach((item)=>{
      // 숫자가 짝수이면 소수가 아니기 때문에 2로 시작
      // 어떤 숫자로든 나눠지면 소수가 아니기 때문에 m++를 해서
      // 나눠 지는 지 확인한다.
      for(let m = 2; m < item; m++){
        if(item % m === 0){
          count++
          break
        }
        // 나눠지는 숫자가 있으면 count++를 하고
        // 반복문을 끝낸다.
      }
    })

    return decArr.length - count;
    // 3개의 숫자를 더한 decArr에서 소수가 아닌 숫자의 개수를 뺀다.
}

처음 문제를 풀 때 for문을 너무 많이 사용하는 것 같아서 forEach()를 사용해 보았는 데 코드 길이는 조금 짧아졌지만 비슷한 것 같다는 느낌이 들었다.

 

다른 사람이 푼 문제 풀이

//2. 다른풀이
function solution(nums) {
    let answer = 0;
    
    //1. 3자리 숫자 만들기
    const len = nums.length;
    for (let i = 0; i < len; i++){
        for (let j = i+1; j < len; j++){
            for (let k = j+1; k < len; k++) {
                const number = nums[i]+nums[j]+nums[k];
                if (isPrime(number))
                    answer++;
            }
        }
    }

    //2. 소수 판별(2~number까지 하나씩 비교)
    function isPrime(number){
        if (number < 2) return true;
        for (let i = 2; i < number; i++){
            if (number % i == 0) return false;
        }
        return true;
    }
    
    return answer;
}

다른 분들의 코드 풀이를 보니 소수 판별하는 함수를 따로 만들어서 true이면 answer를 1 늘리고 false이면 answer의 개수를 그대로 두도록 코드를 짜셨다. 함수 안에 함수를 쓰는 방법은 생각하지 못했었는 데 좋은 것 같다.

 

https://velog.io/@sso/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-JavaScript-%EC%86%8C%EC%88%98%EB%A7%8C%EB%93%A4%EA%B8%B0

 

프로그래머스 #JavaScript - 소수만들기

참고사항

velog.io

 

소수 판별식 참고 하면 좋을 것 같음

https://ant-programmer.tistory.com/2

 

[JavaScript] 소수 판별식

소수(Prime Number)를 판별하는데 여러가지 방법이 있는데 오늘은 내가 알고리즘 공부를 하면서 직접 찾아본 세 가지 방법을 정리하려한다. 1) 직접 나누어서 계산하기 2) N/2 까지만 나누어서 계산하

ant-programmer.tistory.com

 

https://programmers.co.kr/learn/courses/30/lessons/12977

 

코딩테스트 연습 - 소수 만들기

주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때

programmers.co.kr

 

댓글