알고리즘/프로그래머스 Level1

[프로그래머스,Java] Level1 : 소수 만들기

류창 2021. 7. 29. 22:01
반응형

문제 설명

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

제한사항

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.util.*;
class Solution {
    //3자리의 숫자를더한 모든경우의 리스트생성
    List<Integer> list = new LinkedList<>();
    
    public int solution(int[] nums) {
        int answer = 0;
 
        boolean[] visited= new boolean[nums.length];
        combine(nums,visited,0,3);
    
 
    //소수인지 검사            
        for(int data:list){
            boolean flag = true;
        for(int i=2;i<=Math.sqrt(data);i++){
            if(data%i==0){
                flag=false;
                break;
            }
        }
            if (flag==true){
                answer++;
            }
        }
        
        return answer;
    }
    
    //조합 알고리즘
    public void combine (int[] nums,boolean[] visited,int start,int r){
        if(r==0){
            int sum=0;
            for(int i=0;i<nums.length;i++){
                if(visited[i]==true){
                    sum+=nums[i];
                }
            }
            list.add(sum);
            return;
        }
        else{
        for(int i=start;i<nums.length;i++){
            visited[i]=true;
            com(nums,visited,i+1,r-1);
            visited[i]=false;
        }
        }
        
        return;
    }
}
cs

 

문제를 보고 든 생각은 'nums에 있는 서로다른n개의 숫자들을 3개씩 골라 더한값을 소수인지 검사하는 문제구나' 

라고 생각했다.

 

1.조합 알고리즘을 참조해서 작성후 더한 값을 리스트에 저장

 

2.저장된 값을 차례대로 소수 인지 판별하기

 

3.소수가 맞다면, answer에 1씩 더하기

 

 

다른사람의 풀이:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.util.Arrays;
 
class Solution {
 
 
 
    public int solution(int[] nums) {
        int ans = 0;
 
        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 ++ ){
                    if(isPrime(nums[i] + nums[j] + nums[k])){
                        ans += 1;  
                    } 
                }
            }
        }
        return ans;
    }
    public Boolean isPrime(int num){
        int cnt = 0;
        for(int i = 1; i <= (int)Math.sqrt(num); i ++){
            if(num % i == 0) cnt += 1
        }
        return cnt == 1;
    }
}
cs

 

다른사람이 풀은 문제를보니, 조합이 아닌 반복문을 3번 사용하여, 숫자 3개를더한값을  소수인지 아닌지 검사하는 코드를 짜셧다.

 

다시 돌아봐야할점:

 

1. 조합을 굳이 안써도 되는데 쓰려고한점 : 조금만더 유도리있게 생각햇다면 반복문 3개를사용해 간단하게 구현할수있었다.

 

2.불필요한 리스트생성: 그냥 매번 더한값을 소수판별만 하면대는데 리스트를 만들었다.

 

3.메소드 활용: 소수판별하는 부분을 메소드로 따로 빼내어 가독성을 높일수 있었을것같다.

반응형