Algorithm/프로그래머스

프로그래머스 소수만들기

chbong 2022. 8. 8. 21:21
package ch.alg;

import java.util.ArrayList;
import java.util.List;

public class Algorithm2 {


    /*
    2022.08.08
    Programmers
    Summer/Winter Coding(~2018)
    소수 만들기

    문제 설명
    주어진 숫자 중 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
     */

    public static int solution(int[] nums) {
        int answer = 0;
        List<Integer> list = new ArrayList<>();

        for(int i = 0 ; i < nums.length-2; i++){

                for(int j = i+1; j < nums.length-1; j++){
                    for(int k = j+1; k< nums.length; k++){
                        list.add(nums[i]+nums[j]+nums[k]);

                    }
                }

        }

        int cnt;

        for (Integer integer : list) {
            cnt = 0;
            for (int i = 2; i <= Math.sqrt(integer); i++) {
                if (integer % i == 0) {
                    cnt++;
                }

            }
            if (cnt == 0) {
                answer++;
            }
        }
        return answer;
    }

    public static void main(String[] args) {
        int[] num = {1,2,3,4};
        System.out.println(solution(num));
    }
}


 

문제풀이

배열을 중복없이 3개만들어서 합을 list에 담는다.

list에 있는값을 for문으로 돌려서 2부터 나눠서 만약 몫이 있다면 cnt가 ++되고 소수가 아닌것이 되는것이다.

여기서 주목할 것은 Math.sqrt 함수인데 제곱근을 구하는 함수이다.

즉, list의 제곱근을 구하여 그 수까지만 나누어보면 소수를 판별할 수 있다.

제곱근까지가 아닌, 합까지 for문을 돌리게 된다면 시간이 오래걸릴 것 같아서

Math.sqrt함수를 사용하게 되었다.