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;
}
'알고리즘 문제 풀이 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 모의고사 [파이썬] [자바스크립트] (0) | 2022.05.07 |
---|---|
프로그래머스 - 완주하지 못한 선수 [파이썬] [자바스크립트] (0) | 2022.05.07 |
프로그래머스 - 내적 [파이썬] [자바스크립트] (0) | 2022.05.06 |
프로그래머스 - 음양 더하기 [파이썬] [자바스크립트] (0) | 2022.05.06 |
프로그래머스 - 없는 숫자 더하기 [파이썬] [자바스크립트] (0) | 2022.05.06 |