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

 

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

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

programmers.co.kr

 


풀이 과정

에라토스테네스의 체를 이용하여 3000이하의 수에 대해 소수판정을 한 뒤, 배열에서 3개의 수를 뽑는 모든 수에 대해 합이 소수인지 판정하여 answer 값을 1 추가할지 말지 결정하였다.

 

에라토스테네스의 체

특정 수 n이하의 모든 소수를 구할 때 사용하는 방법이다.

check = [False for _ in range(3001)]

for i in range(2, 3001):
    if check[i] == False:
        for j in range(2*i, 3001, i):
            check[j] = True

check 배열을 하나 선언해두고

1. 2는 체크되지 않았으니 소수 => 2의 배수는 전부 2로 나누어지므로 소수가 아니니 True로 체크해준다

2. 3은 체크되지 않았으니 소수 => 3의 배수는 전부 3으로 나누어지므로 소수가 아니니 True로 체크해준다

3. 4는 체크되었으니 소수가 아님

4. 5는 체크되지 않았으니 소수 => 5의 배수는 전부 5로 나누어지므로 소수가 아니니 True로 체크해준다

...

 

위와 같은 방법을 이용하여 3000까지의 모든 자연수에 대해 소수 판정을 했다. 

 

 


소스 코드

파이썬

check = [False for _ in range(3001)]

for i in range(2, 3001):
    if check[i] == False:
        for j in range(2*i, 3001, i):
            check[j] = True


def solution(nums):
    answer = 0

    for i in range(len(nums) - 2):
        for j in range(i+1, len(nums) - 1):
            for k in range(j+1, len(nums)):
                if not check[nums[i] + nums[j] + nums[k]]:
                    answer += 1

    return answer

 

자바스크립트

function solution(nums) {
    var check = []
    let answer = 0
    for (var i = 0; i < 3001; i++) {
        check.push(false)
    }

    for (var i = 2; i < 3001; i++) {
        if (check[i] === false) {
            for (var j = 2 * i; j < 3001; j += i) {
                check[j] = true
            }
        }
    }

    for (var i = 0; i < nums.length - 2; i++) {
        for (var j = i+1; j < nums.length - 1; j++) {
            for (var k = j+1; k < nums.length; k++) {
                if (!check[nums[i] + nums[j] + nums[k]]) {
                    answer += 1
                }
            }
        }
    }

    return answer;
}

+ Recent posts