프로그래머스

[프로그래머스/Java] 소수 만들기

웅둘 2023. 6. 24. 21:06

📚 소수 만들기

[JAVA] 프로그래머스 Level 1.

코딩테스트 연습 - 소수 만들기 | 프로그래머스 스쿨 (programmers.co.kr)

문제

주어진 숫자 중 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

문제 해결 방안

 배열에 들어있는 숫자 3개를 더한 값이 소수인지 판단하는 문제입니다.

배열에 들어있는 숫자 3개 -> 중복 x, 숫자를 더한 값 -> 순서가 상관없음 

- 즉 조합을 의미

조합을 이용하여 숫자 3개를 구한 뒤 소수인지 판단한다.

소스 코드

class Solution {
    int answer = 0;
    public int solution(int[] nums) {
        combination(nums, new int[3], new boolean[nums.length], 0, 0, 3);
        return answer;
    }
    
    public boolean combination(int[] nums, int[] outs, boolean[] visited, int start, int depth, int k) {
        if(depth == k) {
            int sum = 0;
            for(int n : outs) {
                sum+=n;
            }
            
            for(int i=2; i*i<=sum; i++){
                if(sum % i == 0) return false;
            }
            answer +=1;
            return true;
        }
        
        for(int i=start; i<nums.length; i++) {
            if(!visited[i]) {
                outs[depth] = nums[i];
                visited[i] = true;
                combination(nums, outs, visited, i, depth+1, k);
                visited[i] = false;
            }
        }
        return false;
    }
}

풀고나서…

소수 구하기, 조합, 순열 알고리즘을 알아두자