■ 문제 설명
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.
■ 제한 사항
- nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
- nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.
■ 풀이
//소수 구하기
function prime(num) {
for(let a=2; a<num; a++) {
if(num%a === 0) { //받은 수가 a에 나누어떨어지면 소수가 아니기 때문에 false 반환
return false;
}
}
return true; //해당 사항 없으면 true 반환
}
function solution(nums) {
let answer = 0;
for(let i=0; i<nums.length; i++) {
for(let j=i+1; j<nums.length; j++) {
for(let k=j+1; k<nums.length; k++) {
if(prime(nums[i]+nums[j]+nums[k])) { //3개의 숫자를 골라서 prime 함수에 전달
answer++; //true를 반환받으면 소수가 되는 경우의 개수 증가
//console.log(answer); //소수가 되는 경우의 개수
//console.log(nums[i], nums[j], nums[k], "num"); //소수를 만드는데 사용된 숫자 3개
//console.log(i, j, k, "index"); //소수를 만드는데 사용된 숫자의 index값
}
//console.log(nums[i], nums[j], nums[k]); //소수를 만들지 못하는 숫자 3개
//console.log(i, j, k); //소수를 만들지 못하는 숫자의 index값
}
}
}
return answer;
}
나는 이것을 검색해보고 풀었다. 소수가 1이랑 자기 자신 빼고는 나누어 떨어지는 숫자가 없는 숫자라는 것을 알고 있었는데 이것을 코드로 어떻게 해야 할지 아무리 생각해도 모르겠어서 검색을 했는데 생각보다 쉬워서 허무했다.
소수 구하는 방법을 알아내고 이제 solution 함수가 문제였는데 한참을 삽질하다가 도저히 안되겠어서 검색해봤는데 j의 시작 값에 1이 아니라 i+1을 넣어야 하고 k의 시작 값에 2가 아니라 j+1을 넣어야 했다.
for문을 이용해 입력 받은 값들 중에서 3개를 뽑고 소수인지를 확인시킨다.
예를 들어 [1, 2, 7, 6, 4]를 입력받았다면 [1, 2, 7]을 뽑아서 소수인지 확인하고, [1, 2, 6]을 뽑아서 확인하고, [1, 2, 4], [1, 7, 6], [1, 7, 4], [2, 7, 6] ·············[7, 6, 4], 그러니까
[num[0], num[1], num[2]],
[num[0], num[1], num[3]],
[num[0], num[1], num[4]],
[num[0], num[2], num[3]],
[num[0], num[2], num[4]],
[num[0], num[3], num[4]],
[num[1], num[2], num[3]] ·············[num[2], num[3], num[4]]를 뽑아야 하는데 j의 시작 값을 1로 하고 k의 시작 값을 2로 하면 답이 틀리게 나온다.
답이 틀리게 나오는 이유 첫 번째는 소수를 만드는데 이용했던 숫자 3개를 뒤에서 또 이용했기 때문이다.
예를 들어 앞에서 [1, 6, 4]를 뽑아서 소수가 되는 경우의 수를 1 더해주었는데 뒤에 [1, 4, 6]가 또 나와서 소수가 되는 경우의 수를 또 1을 더하기 때문에 답이 틀리게 나온다. 이미 1, 6, 4 숫자 조합을 이용해서 소수가 되는 경우의 수를 더해주었기 때문에 1, 4, 6 숫자조합을 이용하면 안 된다.
답이 틀리게 나오는 이유 두 번째는 소수를 만드는데 이용할 숫자 3개 안에 중복된 값이 있기 때문이다.
j의 시작 값을 1로 하고 k의 시작 값을 2로 하면 [num[0], num[1], num[2]], [num[0], num[1], num[3]], [num[0], num[1], num[4]], [num[0], num[2], num[2]]가 나와서 배열 안에 중복된 값이 나오기 때문에 틀린 값이다.
j의 시작 값에 i+1을 넣고 k의 시작값에 j+1을 넣으면 소수를 만드는데 이용했던 숫자 조합을 또 이용하는 경우도 없고 소수를 만드는데 이용할 숫자 3개 안에 중복된 값이 생기는 경우도 없다.
만약에 이해가 되지 않는다면 위 코드와 아래 코드의 console.log부분의 주석을 해제해서 console 값을 비교해보면 대충 어떤 느낌인지 알 것이다.
//위의 코드랑 다른 코드
function prime(num) {
for(let a=2; a<num; a++) {
if(num%a === 0) {
return false;
}
}
return true;
}
function solution(nums) {
let answer = 0;
for(let i=0; i<nums.length; i++) {
for(let j=1; j<nums.length; j++) {
for(let k=2; k<nums.length; k++) {
if(prime(nums[i]+nums[j]+nums[k])) {
answer++;
console.log(answer); //소수가 되는 경우의 개수
console.log(nums[i], nums[j], nums[k], "num"); //소수를 만드는데 사용된 숫자 3개
console.log(i, j, k, "index"); //소수를 만드는데 사용된 숫자의 index값
}
console.log(nums[i], nums[j], nums[k]); //소수를 만들지 못하는 숫자 3개
console.log(i, j, k); //소수를 만들지 못하는 숫자의 index값
}
}
}
return answer;
}
'공부 > 프로그래머스' 카테고리의 다른 글
프로그래머스 레벨1 약수의 개수와 덧셈 자바스크립트 풀이 (0) | 2022.01.21 |
---|---|
프로그래머스 레벨 1 K번째수 자바스크립트 풀이 (0) | 2022.01.16 |
프로그래머스 레벨 1 없는 숫자 더하기 자바스크립트 풀이 (0) | 2022.01.10 |
프로그래머스 레벨 1 음양 더하기 자바스크립트 풀이 (0) | 2021.12.30 |
프로그래머스 레벨 1 2016년 자바스크립트 풀이 (0) | 2021.12.28 |