본문 바로가기

알고리즘

소수만들기(lv1)

반응형
문제 설명

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

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

입출력 예numsresult
[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을 만들 수 있습니다.

20220805 진행중인 코드 ( 이전에 작성했지만 기억안남)

더보기
import java.util.*;
class Solution {
    public int solution(int[] nums) {
        boolean[] prime = new boolean[2998];
        int answer = 0;
        // Set<Integer> numsAdded = new HashSet<>();
        this.makePrimeNumbers(2998,prime);
        Set<Integer> numsAdded = new HashSet<>();
        
        for(int i=0; i<nums.length; i++){
            for(int j=i+1; j<nums.length; j++){
                numsAdded.add(nums[i]+nums[j]);
            }
        }
        
        
        for(int numsAdd :  numsAdded){
            for(int i=0; i< nums.length; i++){
                
                int tryout = numsAdd + nums[i];
                System.out.println("added number : " + numsAdd + " nums : " + nums[i] + " tryout : " + tryout);
                if(!prime[tryout]){
                    System.out.println("isPrime ? " + prime[tryout]);
                    answer++;
                }
            }
        }
        
        // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
        // System.out.println("Hello Java");

        return answer;
    }
    
 
    public void makePrimeNumbers(int N, boolean[] prime){

		/*
		소수가 아닌 index = true
		소수인 index = false
		*/
		
		// 2 미만의 N 을 입력받으면 소수는 판별할 필요 없으므로 바로 return
		if(N < 2) {
			return;
		}
        
		prime[0] = prime[1] = true;
		
        
		// 제곱근 함수 : Math.sqrt()
		for(int i = 2; i <= Math.sqrt(N); i++) {
        
			// 이미 체크된 배열이면 다음 반복문으로 skip
			if(prime[i] == true) {
				continue;
			}
        
			// i 의 배수들을 걸러주기 위한 반복문
			for(int j = i * i; j < prime.length; j = j+i) {
				prime[j] = true;
			}
		}
    }
    
    
}

20220805 완성코드

더보기
import java.util.*;
class Solution {
    public int solution(int[] nums) {
        boolean[] prime = new boolean[2998];
        int answer = 0;
        List<Integer> numsList = new ArrayList<>();
        this.makePrimeNumbers(2998,prime);
        
        
        for(int i=0; i<nums.length; i++){
            for(int j=i+1; j<nums.length; j++){
                for(int w=j+1; w<nums.length; w++){
                    int tryOutNumber =  nums[i] + nums[j] + nums[w];
                    numsList.add(tryOutNumber);
                }
            }
        }
    
        for(Integer num : numsList){
            if(!prime[num]){
                answer++;
            }
        }
        return answer;
    }
    
 
    public void makePrimeNumbers(int N, boolean[] prime){

		/*
		소수가 아닌 index = true
		소수인 index = false
		*/
		
		// 2 미만의 N 을 입력받으면 소수는 판별할 필요 없으므로 바로 return
		if(N < 2) {
			return;
		}
        
		prime[0] = prime[1] = true;
		
        
		// 제곱근 함수 : Math.sqrt()
		for(int i = 2; i <= Math.sqrt(N); i++) {
        
			// 이미 체크된 배열이면 다음 반복문으로 skip
			if(prime[i] == true) {
				continue;
			}
        
			// i 의 배수들을 걸러주기 위한 반복문
			for(int j = i * i; j < prime.length; j = j+i) {
				prime[j] = true;
			}
		}
    }
    
    
}

음... 결과적으로 for문을 3중으로 돌렸는데, 이게 맞는걸까? 그리고 소수를 판별하는 로직도 또 까먹었다. 에라토스테네스?.. 체?.. 그건 잊어먹은건 차치하고 서라도 그.. 뭐냐 기본적으로 소수를 판별하는 방법조차 까먹었다. 1부터 N까지 모든 수를 나눠보는 매우 나이브한 로직조차 생각을 못했다.... 에휴...  일단 오늘은 풀었으니 오케이!

 

반응형

'알고리즘' 카테고리의 다른 글

로또의 최고순위와 최저순위(lv1)  (0) 2022.08.10
신규아이디 추천 (lv1)  (0) 2022.08.08
전화번호목록(lv2)  (0) 2022.08.02
키패드누르기(lv1)  (0) 2022.07.28
신고결과받기(lv1)  (0) 2022.07.27