스터디/코딩테스트

javascript 코딩테스트 - 소수 만들기

공대생철이 2023. 4. 15. 17:21
728x90

문제 설명
주어진 숫자 중 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을 만들 수 있습니다.

 

처음 든 생각

- 반복문을 돌리면서 세 개의 합을 담은 배열을 만들어야겠다.

- 소수를 검증하는 함수를 따로 만들어서 배열을 돌려야겠다. 

- 겹치는 애들은 중복을 제거해줘야겠다.

 

나의 답

function solution(nums) {
    var answer = 0;
    const tmpArr = []
    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++){
                tmpArr.push(nums[i]+nums[j]+nums[k])
            }
        }
    
    const checkPrime = (num)=>{
        const countPoint = Math.ceil(Math.sqrt(num))
        let measureCount = 0;
        for(let i = 1; i<=countPoint ; i++){
            if(num % i ===0){
                measureCount++
            }
        }
        answer = measureCount > 1 ? answer : ++answer
    }
    for(let num of tmpArr){
        checkPrime(num)
    }
    
    return answer;
}

먼저 3개씩을 묶어서 더한 값을 넣을 tmpArr를 선언한다. 

for문을 세개 중첩해서 인덱스가 겹치지 않도록 반복문을 돌면서 배열에 push를 해준다.

i나 j가 끝자락에 다다랐을때 k에 대한 부분이 살짝 고민됐는데 k가 length보다 커지면 for문이 실행될 수 없어 아예 push가 안되기 때문에 예외처리를 해줄 부분은 없었다. 

 

그렇게 하고 처음에 set으로 만들어주고 다시 배열로 만들어서 중복을 제거해줬다.

이렇게 풀고 계속 틀렸는데 문제를 자세히 보니 세 수의 합이 같더라도 그 조합이 다르면 다른 경우로 간주해야되는 거였다.

문제를 잘 이해하자...

 

소수인지 아닌지 확인하는 함수를 선언한다.

제곱근 값을 불러서 거기까지 나머지가 0인 부분만 세어주면 된다.

1이외의 값이 있으면 안되므로 나눠지는 수가 1보다 크면 answer은 냅두고 아니면 1을 추가해준다.

 

그러고 세수의 합을 넣은 배열에 반복문을 돌려준다. 

 

 

728x90