티스토리 뷰

문제

주어진 숫자 중 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을 만들 수 있습니다.

 


첫 풀이(실패)

import java.util.*;
class Solution {
    public int solution(int[] nums) {
        int answer = 0;
        HashSet<Integer> set = new HashSet<>();
        
        for(int i =0; i < nums.length ; i++){
            if(i+2 >= nums.length){
                break;
            }
            for(int j = i +1 ; j < nums.length ; j++){
                for(int k = i +2 ; k <nums.length ; k++){
                    set.add(nums[i]+nums[j]+nums[k]);
                }
            }   
        }
         for(int sum : sumList){
             answer++;
             for(int count = 2; count < sum; count++){
                 if(sum % count == 0 ){
                     answer--;
                     break;
                 }
             }
         }
        return answer;
    }
}

처음에는 HashSet을 이용하였다가 뒤늦게 다른 수들의 합이 중복이 될 수 있겠다는 생각이 들었다.

예시만 보고 작업했을때는 합 중복이 없어서 전에 써봤던 HashSet을 써보기로 한것이 내 발목을 잡았다.

완성

import java.util.*;
class Solution {
    public int solution(int[] nums) {
        int answer = 0;
       ArrayList<Integer> sumList = new ArrayList<Integer>();
             
        for(int i = 0; i < nums.length; i++) {
        	if(i + 2 >= nums.length) {
                break;
            }
        	for(int j = i + 1; j < nums.length; j++) {
        		for(int k = j + 1; k < nums.length; k++) {
        			sumList.add(nums[i] + nums[j] + nums[k]);
        		}
        	}
        }
         for(int sum : sumList){
             answer++;
             for(int count = 2; count < sum; count++){
                 if(sum % count == 0 ){
                     answer--;
                     break;
                 }
             }
         }
        return answer;
    }
}

이번에는 ArrayList로 합들을 담았다.

그리고 반복문을 돌려 2이상의 수를 나누어 나머지가 0이나오면 answer--시키고 break를 시켰다.

 

다른 분의 풀이를 보고 해본 코드

class Solution {
    public boolean check(int n){
        for(int i = 2; i < n ; i++){
            if(n%i == 0){
                return false;
            }
        } return true;
    }
    public int solution(int[] nums) {
        int answer = 0;
        int sum;
        for(int i = 0; i < nums.length; i++) {
        	if(i + 2 >= nums.length) {
                break;
            }
        	for(int j = i + 1; j < nums.length; j++) {
        		for(int k = j + 1; k < nums.length; k++) {
        			sum = nums[i] + nums[j] + nums[k];
                    if(check(sum)){ answer++; }
        		}
        	}
        }return answer;
    }
}

다른 사람들의 풀이를 봤을때 따로 메소드를 빼내서 사용할 수도 있겠다는걸 또 한번 느꼈다.

이렇게 따로 소수를 확인하는 구문을 빼내니 가독성이 더 좋아진것 같다.

 

 

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
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
글 보관함