728x90
반응형
SMALL

문제 설명

주어진 숫자 중 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

입출력 예 설명

입출력 예 #1[1,2,4]를 이용해서 7을 만들 수 있습니다.

입출력 예 #2[1,2,4]를 이용해서 7을 만들 수 있습니다.[1,4,6]을 이용해서 11을 만들 수 있습니다.[2,4,7]을 이용해서 13을 만들 수 있습니다.[4,6,7]을 이용해서 17을 만들 수 있습니다.

  • nums의 각 원소는 1이상 1,000 이하의 자연수이기 때문에 3개의 수를 골라 더했을 때 나올 수 있는 최대값은 2997 ( 1000 + 999 + 998 )
  • 에라토스테네스의 체 알고리즘을 이용하여 0부터 2997까지 소수여부를 판단
  • nums배열에서 세 원소를 골라 더했을 때 소수인지 아닌지 확인

https://ko.wikipedia.org/wiki/에라토스테네스의_체

에라토스테네스의 체 알고리즘

공부해보기…!!

class Solution {
    boolean[] prime = new boolean[2998];// 소수 배열, false면 소수// 에라토스테네스의 체public void isPrime(){
        prime[0] = prime[1] = true;

        for(int i = 2; i <= Math.sqrt(prime.length); i++){
            if(!prime[i]){
                for(int j = i + i; j < prime.length; j += i){
                    prime[j] = true;
                }
            }
        }
    }
}

에라토스테니스의 체를 이용해서 풀기

class Solution {
    boolean[] prime = new boolean[2998]; // 소수 배열, false면 소수
    
    public int solution(int[] nums) {
        int answer = 0;

        isPrime();
        
        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(!prime[sum]) answer++;
                }
            }
        }

        return answer;
    }
    
    // 에라토스테네스의 체
    public void isPrime(){
        prime[0] = prime[1] = true;
        
        for(int i = 2; i <= Math.sqrt(prime.length); i++){
            if(!prime[i]){
                for(int j = i + i; j < prime.length; j += i){
                    prime[j] = true;
                }
            }
        }
    }
    
}
package LV1;

import java.util.Arrays;

/*
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다.
숫자들이 들어있는 배열 nums가 매개변수로 주어질 때,
nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.
 */
public class H1277 {
        public static int answer = 0;
        public static int solution(int[] nums) {

            for(int i = 0; i < nums.length; i++){
                for(int j = i+1; j< nums.length; j++){
                    for(int k = j+1; k < nums.length; k++){
                        int sum = nums[i] + nums[j] + nums[k];
                        check(sum); 
//https://docs.oracle.com/javase/8/docs/api/java/util/zip/Checksum.html
//https://en.wikipedia.org/wiki/Checksum
                    }
                }
            }
            return answer;
        }

        // 소수 판단 함수
        public static void check(int num){
            int i = 2;
            while (i*i <= num){
                // 소수가 아닐 때
                if(num%i == 0){
                    return;
                }
                i+=1;
            }
            answer++;
        }

    public static void main(String[] args){
        int[] nums = new int[]{1,2,3,4};
        System.out.println(Arrays.toString(new int[][]{new int[]{solution(nums)}}));
        System.out.println(solution(nums));
    }
}
728x90
반응형
LIST

'알고리즘 > 프로그래머스 JAVA LV.1' 카테고리의 다른 글

시저 암호  (1) 2023.01.30
숫자 문자열과 영단어  (0) 2023.01.30
예산  (0) 2023.01.30
약수의 합  (0) 2023.01.30
문자열 내 마음대로 정렬하기  (0) 2023.01.28

+ Recent posts