알고리즘 공부/프로그래머스

(Java)프로그래머스 코딩테스트 연습 - Summer/Winter Coding(~2018) - 소수 만들기

HRuler 2020. 11. 29. 16:08

1. 문제

https://programmers.co.kr/learn/courses/30/lessons/12977

 

코딩테스트 연습 - 소수 만들기

주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때

programmers.co.kr

2. 나의 풀이

class Solution {
    
    int count = 0;
    
    public int solution(int[] nums) {
        explore(nums, new boolean[nums.length], 0, nums.length, 3);
        return count;
    }
    
    void explore(int [] nums, boolean[] visited, int start, int n, int r) {
    	if(r == 0) {
    		int sum = 0;
    		for(int i = 0; i < n; i = i + 1) {
    			if(visited[i] == true) {
    				sum += nums[i];
    			}
    		}
    		
    		if(isPrimeNumber(sum)) {
    			count++;
    		}
    		return;
    	}else {
    		for(int i = start; i < n; i = i + 1) {
    			if(visited[i] == false) {
    				visited[i] = true;
    				explore(nums, visited, i + 1, n, r - 1);
    				visited[i] = false;
    			}
    		}
    	}
    }
    
    boolean isPrimeNumber(int sum) {
    	for(int i = 2; i < sum; i = i + 1) {
    		if(sum % i == 0) {
    			return false;
    		}
    	}
    	return true;
    }
}

3. 다른 사람 풀이

class Solution {
    public static int result = 0;
    public int solution(int[] nums) {
        int answer = 0;
        int n = nums.length;
        int r = 3;
        int[] arr = new int[n];
        combination(arr, 0, n, r, 0, nums);
        answer = result;
        //if(n == r || r == 0) 
          //  return result = 1;
        //else 
            //result = combination2(n - 1, r - 1) + combination(n - 1, r);

        // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
        //System.out.println("result : " + result);

        return answer;
    }
    public int combination2(int n, int r) {

        if(n == r || r == 0) 
            return 1;
        else 
            return combination2(n - 1, r - 1) + combination2(n - 1, r);

    }
    public static void combination(int[] arr, int index, int n, int r, int target, int[] nums) { 
        if (r == 0) 
            print(arr, index); 
        else if (target == n) 
            return; 
        else { 
            arr[index] = nums[target]; 
            combination(arr, index + 1, n, r - 1, target + 1, nums); 
            combination(arr, index, n, r, target + 1, nums); 
        } 
    }//end combination() 
    public static void print(int[] arr, int length) { 
        int cnt = 0;
        boolean isPrime = false;
        for (int i = 0; i < length; i++) {
            cnt += arr[i];
            // System.out.print(arr[i]); 

        }
        System.out.println("cnt :" + cnt);
         for (int i = 2; i < cnt; i++) {
            // 1과 num 자신 외에 나누어지는 수가 있는지 검사할 조건문
            if (cnt % i == 0) {
                // 나누어지는 수가 있을 경우 isPrime의 값을 true로 바꾼다.
                isPrime = true;
                // 한 번이라도 이 조건문이 실행될 경우 num은 소수가 아니므로 반복문을 빠져나온다.
                break;
            }
        }
        if (!isPrime) {
            result++;
        }
    }
}