프로그래머스 - 소수 만들기

Park Suyong·2021년 11월 7일
0

개인 알고리즘

목록 보기
15/19

문제

  • 문제 설명

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

문제 풀이

솔직히 이 문제는 최대한 효율적인 방법을 찾기 위해 많은 고민을 했다.

처음엔 조합을 생각했다. N개 중에서 3개를 뽑는 모든 경우의 수를 찾아 더해, 그것이 소수인지를 확인하려고 했으나 생각보다 이 문제를 위해 구현해 풀기는 까다로웠다.

그 다음으로는 최대한 단순하게 i번째 인덱스와 i + 1번째 인덱스를 확정한 뒤 나머지 인덱스를 한 번씩 순회해 가며 더하고, 그것이 소수인지 판별하려고 했다. 그러나 반복문이 3개가 쓰일 것이라는 생각이 이를 구현하는 데 계속 발목을 잡았다. 앞서 말했듯 최대한 효율적인 방법을 찾기 위해서.

HashSet도 시도해 봤고, ArrayList를 통해 구현하려고도 했으나 실패했다.

결국 검색을 시도했고, 많은 사람들이 3개의 반복문을 중첩하여 사용했길래 나도 그냥 그렇게 풀긴 했으나, 다른 방법을 찾아서 시도할 계획이다.

class Solution {
    public int solution(int[] nums) {
        int answer = 0;
        int sum = 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++) {
                    sum = nums[i] + nums[j] + nums[k];
                    if(isPrime(sum))
                        answer++;
                } 
        
        
        return answer;
    }
    
    public static boolean isPrime(int num) {
        int cnt = 0;
        for(int i = 1; i <= num; i++) 
            if(num % i == 0) cnt++;
        
        return cnt == 2 ? true : false;
    }
}
profile
Android Developer

0개의 댓글