본문 바로가기

기록/알고리즘

[Programmers][Java] 소수 만들기

SMALL

https://programmers.co.kr/learn/courses/30/lessons/12977?language=java 

 

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

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

programmers.co.kr

배열 내의 숫자를 임의로 3개를 뽑아 소수가 되는지 확인하는 작업이다. (중복 허용하지 않음)

따라서 이 문제를 배열 내 숫자 중 3개를 조합으로 뽑고, 소수를 판별하는 부분으로 나누어 풀었다.

 

package com.company;

import java.lang.reflect.Array;
import java.util.*;
import java.util.stream.Stream;

public class Main {
    static int total = 0;
    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4};
        int[] bucket = new int[3];
        pick(nums, bucket, bucket.length);
        System.out.println(total);
    }
    //임의의 k개를 조합으로 뽑는 함수
    //bucket의 길이만큼 뽑는다.
    public static void pick(int[] nums, int[] bucket, int k) {
        if(k == 0) {
            if(isPrime(Arrays.stream(bucket).sum())) {
                total++;
            }
            return;
        }

        int lastIdx = bucket.length - k - 1;

        for(int i = 0; i < nums.length; i++) {
            if(bucket.length == k) {
                bucket[0] = nums[i];
                pick(nums, bucket, k - 1);
            } else if(bucket[lastIdx] < nums[i]) {
                bucket[lastIdx + 1] = nums[i];
                pick(nums, bucket, k - 1);
            }
        }

    }
    //소수 판별
    //Math.sqrt를 활용하여 더 빠른 판별이 가능하다.
    public static boolean isPrime(int n) {
        for(int i = 2; i <= (int)Math.sqrt(n); i++) {
            if(n % i == 0) {
                return false;
            }
        }
        return true;
    }
}

 

Arrays.stream(bucket).sum()

-> bucket의 내부 내용을 모두 더하는 스트림을 활용하여 구현했다.

 

 

SMALL

'기록 > 알고리즘' 카테고리의 다른 글

[Programmers][Java] 실패율  (0) 2022.05.23
[Java] Builder 패턴  (0) 2022.03.31
[카카오] 신고 결과 받기  (0) 2022.02.26
[백준][JAVA] 큰 수 A+B  (0) 2021.12.19
[Programmers] [JAVA] 더 맵게  (0) 2021.11.05