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

728x90

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

주어진 정수 중 3개를 더했을 때 소수가 되는 경우의 수를 구하는 문제이다.

3중 for문으로 간단하게 구현할 수 있다.

 

주어진 구간 내(배열의 크기)에서 각각 3개의 수를 선택하여 더하는 간단한 구조이다.

public int solution(int[] nums) {
        int answer = 0;
        boolean[] isPrime = eratos(2999);

        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++){
                    int sum = nums[i] + nums[j] + nums[k];
                    if(isPrime[sum]){
                        answer++;
                    }
                }
            }
        }

        return answer;
    }

 

소수 판별은 에라토스테네스의 체를 이용하여 구하였다.

에라토스테네스의 체란? 
구간 내의 모든 소수를 미리 구하는 방식으로, 소수의 배수는 소수가 될 수 없음을 이용하여 소수를 찾았다면 구간 내의 모든 소수의 배수를 미리 지워 구간 내에 소수만 남기는 방식을 말한다.

https://i-am-strong-man.tistory.com/120

 

[소수] 백준 4134번: 다음 소수 Java

테스트 케이스로 주어진 각 정수와 같거나 더 큰 소수 중 가장 작은 소수 하나를 구하는 문제이다. 10의 9승 * 4의 제법 큰 수를 대상으로 해야하기 때문에 처음에는 에라토스테네스의 체를 사용

i-am-strong-man.tistory.com

https://i-am-strong-man.tistory.com/69

 

[정수론] 백준 2581번 - 소수 Java

주어진 입력 M, N에 대하여 M부터 N까지의 자연수 중 소수인 것을 모두 골라 이들의 합과 최솟값을 찾는 문제이다. 간단하게 생각했을 때 소수를 찾는 법은 어떠한 자연수 K에 대하여 나누는 제수

i-am-strong-man.tistory.com

 

  boolean[] eratos(int max){
        boolean[] isPrime = new boolean[max];
        Arrays.fill(isPrime, true);
        isPrime[0] = isPrime[1] = false;
        for(int i = 2 ; i*i<=max ; i++){
            if(isPrime[i]){
                for(int j = i*i; j <=max ; j+=i){
                    isPrime[j] = false;
                }
            }
        }
        return isPrime;
    }

 

 

전체코드

import java.io.IOException;
import java.util.Arrays;
class Solution {
  boolean[] eratos(int max){
        boolean[] isPrime = new boolean[max];
        Arrays.fill(isPrime, true);
        isPrime[0] = isPrime[1] = false;
        for(int i = 2 ; i*i<=max ; i++){
            if(isPrime[i]){
                for(int j = i*i; j <=max ; j+=i){
                    isPrime[j] = false;
                }
            }
        }
        return isPrime;
    }

    public int solution(int[] nums) {
        int answer = 0;
        boolean[] isPrime = eratos(2999);

        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++){
                    int sum = nums[i] + nums[j] + nums[k];
                    if(isPrime[sum]){
                        answer++;
                    }
                }
            }
        }

        return answer;
    }
}
728x90