코딩테스트/프로그래머스

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

Jindory 2022. 3. 23. 20:26
반응형

문제 설명

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

제한사항

  • nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
  • nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.

전체코드(Java)

import java.util.*;

class Solution {
    
    public static LinkedList<int[]> box = new LinkedList<>();
    
    public int solution(int[] nums) {
        int answer = 0;
        int[] comArr = new int[3];
        // nums에 들어있는 숫자들 중 3개를 골라 조합 만들기
        combination(nums.length,3,0,0,nums,comArr);
        
        for(int[] n : box){
            // 만든 조합들이 소수일 경우 1을 소수가 아닐경우 0을 누적
            answer += isPrime(Arrays.stream(n).sum());
        }
        
        return answer;
    }
    
    // 주어진 배열(intArr)에서 r개의 숫자를 뽑으면서 순서와 상관없는 숫자 배열 만들기(조합)
    public static void combination(int n, int r, int index, int target, int[] intArr, int[] comArr) {    
        // 뽑아야 하는 숫자를 다 뽑은 경우, comArr의 숫자를 box에 담는다.
        if(r == 0){
			int[] num = new int[comArr.length];
            for(int s=0;s<comArr.length;s++){
                num[s] = comArr[s];
            }
            box.add(num);
			return;
		}
        // 재귀횟수가 n과 같다면 반환
        if(target == n) return;
		
        // comArr의 index에 주어진 숫자 배열(intArr)의 target 위치에 해당하는 숫자를 저장한다.
		comArr[index] = intArr[target];
        combination(n,r-1,index+1,target+1,intArr,comArr);    // 번호를 뽑는경우
        combination(n,r,index,target+1,intArr,comArr);     // 번호를 안 뽑는 경우
    
    }
    
    // 숫자가 소수인지 아닌지 판별하여 소수일 경우 1, 소수가 아닐경우 0을 반환
    public static int isPrime(int num){
        if(num < 2){
            return 0;
        }else{
            for(int i=2; i<num; i++){
                if((num%i) == 0){
                    return 0;
                }
            }
        }    
        return 1;
    }
    
}

전체코드(Python)

import itertools
# 소수인지 아닌지를 판별하는 함수이다.
def prime(n):
    if n < 2:
        return 0
    else:
        for i in range(2,n):
            if n % i == 0: 
                return 0
        return 1
    
def solution(nums):
    answer = 0
    # nums 배열중 3개를 선택하여 나올 수 있는 조합을 구한다.
    combi = list(itertools.combinations(nums,3))
    # 조합 배열의 합이 소수이면 1을 더하고 소수가 아니면 0을 더한값을 answer에 누적합 한다.
    for i in range(len(combi)):
        answer += prime(sum(combi[i]))
    
    return answer

 

혹시라도 정정할 내용이나 추가적으로 필요하신 정보가 있다면 댓글 남겨주시면 감사하겠습니다.

오늘도 Jindory 블로그에 방문해주셔서 감사합니다.

 

[참조]

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

반응형