문제 설명
주어진 숫자 중 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://ant-programmer.tistory.com/2
https://programmers.co.kr/learn/courses/30/lessons/12977
'항해 중 > 2주차 알고리즘(프로그래머스)' 카테고리의 다른 글
알고리즘 기초 주차 - 1번 문제 풀이 방법 (0) | 2021.11.13 |
---|---|
5일차 → 신규 아이디 추천(정규표현식, replace(), slice(), charAt(), repeat()) (0) | 2021.11.12 |
4일차 → 문자열 내 마음대로 정렬하기(return 1/-1/0, localCompare()) (0) | 2021.11.11 |
4일차 → 모의고사(filter(), Math.max()) (0) | 2021.11.11 |
4일차 → 최소 직사각형(forEach([값, 값]), map([값, 값])) (0) | 2021.11.11 |
댓글