반응형
문제 설명
주어진 숫자 중 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 |