알고리즘/프로그래머스

[프로그래머스]JAVA - Level1. 소수 만들기

K.두부 2022. 9. 5. 22:38
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/12977

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이

배열 nums에서 임의의 숫자 3개를 선택하여 해당 수의 합이 소수가 되는 경우의 수를 구하는 문제이다. 소수란 1과 자기 자신 외의 약수를 가지지 않는 1보다 큰 자연수이다.

 

우선 배열에서 숫자를 가져올 때 3중 for문을 쓰는 게 생각났다. 하지만 너무 비효율적이라고 생각해서 고민해봤는데 도저히 답이 안나왔고, 구글링을 했을 때도 3중 for문을 써서 해결한 게 대부분이였다.

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++) {
            int sum = nums[i] + nums[j] + nums[k];
            answer += isPrime(sum) ? 1 : 0;
        }
    }
}

이후에 소수를 판별하는 클래스를 만들어주었다. 소수를 판별하는 방법은 크게 3가지가 있다.

 

1. 2부터 해당 숫자까지 나누기

2. 해당 숫자의 √N 까지 나누기

3. 에라토스테네스의 체

 

위 3가지 중에 본인이 원하는 방식으로 구현하면 된다. 나는 2번 방법으로 소수를 판별했다.

 

<최종코드>

class Solution {
    public int solution(int[] nums) {
        int answer = 0;

        // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
        System.out.println("Hello Java");
        
        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++) {
                    int sum = nums[i] + nums[j] + nums[k];
                    answer += isPrime(sum) ? 1 : 0;
                }
            }
        }
        
        return answer;
    }
    
    public boolean isPrime(int num) {
        for (int i=2; i<=Math.sqrt(num); i++) {
            if (num % i == 0) {
                return false;
            }
        }
        
        return true;
    }
}

 

 

반응형