# 문제 원문
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.제한사항
- nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
- nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.
입출력 예
nums / result
[1,2,3,4] | 1 |
[1,2,7,6,4] | 4 |
입출력 예 설명
입출력 예 #1
[1,2,4]를 이용해서 7을 만들 수 있습니다.
입출력 예 #2
[1,2,4]를 이용해서 7을 만들 수 있습니다.
[1,4,6]을 이용해서 11을 만들 수 있습니다.
[2,4,7]을 이용해서 13을 만들 수 있습니다.
[4,6,7]을 이용해서 17을 만들 수 있습니다.
# 문제 풀이
주어진 입력값 배열에서 3가지 요소를 골라서 합한 값을 구한다. 그리고 그 값이 소수인가를 확인하고 소수인 경우의 갯수를 모아서 반환해준다. 반복문이나 재귀함수를 이용해서 3수의 합을 구하고, 그걸 소수인지 검증해주는 간단한 로직을 수행하면 된다. 다만 소수라는 개념에 대한 이해도(흐릿한 기억)에 따라서 문제 난이도가 달라질 수 있을거 같다.
그리고 효율성에 따라서 많이 달라질거 같다. 어지간한 범위라면 소수가 그리 많지 않으니 미니 뜰채를 만들어서 필터링하는게 더 빠를거라 본다.
# 솔루션 플로우
1. 입력 받은 nums 배열에서 3자리를 구한다.
2. 3수 중 첫 수는 모든 경우를 순회하므로 배열에서 꺼내온다. shift보다 pop연산이 배열 특성상 조금이라도 효율적이니 pop으로 끄집어내 준다.
3. 3수 중 두번째 수를 구하고, 그 수를 제외한 수들을 순회하면서 3수의 합을 구한다
4. 그렇게 구해진 3수의 합이 소수인지 검증하고 맞다면 result를 1올려준다.
5 위의 과정을 반복한다.(아무 생각 없이 nums.length를 0 까지 반복시켰는데 사실 그럴 필요는 없다.)
1. 풀이 타이틀
function solution(nums) {
let result = 0;
while (nums.length > 0) { // 반복문을 안쓰고 재귀 함수로 해도 상관없긴하다.
let state = nums.pop();
nums.forEach((num, idx) => {
state += num;
for (let int = idx + 1; int < nums.length; int++) {
state += nums[int];
if(checkPrime(state)) result++;
state -= nums[int];
}
state -= num;
})
}
return result;
function checkPrime(num) {
for(let int = 2; int * int <= num; int++){
if(num % int === 0) return false;
}
return true;
}
}
'개발 > 알고리즘' 카테고리의 다른 글
[프로그래머스][LEVEL1]내적 (0) | 2021.08.13 |
---|---|
[프로그래머스][LEVEL1]숫자 문자열과 영단어. (0) | 2021.08.13 |
[프로그래머스][LEVEL1]상호 평가 (0) | 2021.08.09 |
[프로그래머스][LEVEL1]로또의 최고 순위와 최저순위 (0) | 2021.08.09 |
[프로그래머스][LEVEL1]모의고사 (0) | 2021.08.08 |