[Java] 소수 만들기 (programmers)

Haeun Noh·2022년 9월 4일
0

programmers

목록 보기
10/64
post-thumbnail

0904


문제 설명

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


소스 코드

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

        //주어진 수의 개수 확인
        int cntOfNums = nums.length;
        
        //첫째, 둘째, 셋째로 선택 된 수
        int num1, num2, num3;
        
        //첫째 수 선택하는 for
        for ( int i = 0; i < cntOfNums; i++ ) {
            num1 = nums[i];
            //둘째 수 선택하는 for
            for ( int j = i+1; j < cntOfNums; j++ ) {
                num2 = nums[j];
                //셋째 수 선택하는 for
                for ( int k = j+1; k < cntOfNums; k++ ) {
                    num3 = nums[k];
                    //선택된 3개의 수를 더한다.
                    int sum = num1 + num2 + num3;
                    //소수인지 확인
                    if ( isPrime(sum)) {
                        answer++;
                    }
                }
            }
        }
        
        return answer;
    }
    
    //소수를 판별하는 메서드
    public boolean isPrime(int n) {
        boolean result = true;
        for ( int i = 2; i <= n/2; i++ ) {
            if ( n % i == 0) {
                result = false;
                break;
            }
        }
        return result;
    }
}

소스 풀이

public int solution(int[] nums) {

solution 메서드에 nums 배열을 가져온다.


	int answer = 0;

    //주어진 수의 개수 확인
    int cntOfNums = nums.length;
        
    //첫째, 둘째, 셋째로 선택 된 수
    int num1, num2, num3;

서로 다른 3개의 수를 골라 더했을 때 나오는 소수가 되는 경우의 수를 나타낼 answer 변수를 선언하고 0으로 초기화한다.

외부에서 가져온 nums에 주어진 수의 개수, 즉 nums의 크기를 cntOfNums에 저장한다.


	//첫째 수 선택하는 for
    for ( int i = 0; i < cntOfNums; i++ ) {
        num1 = nums[i];

3개의 수 중 첫 번째 수를 선택하는 for문이다.
주어진 수의 개수를 나타내는 cntOfNums의 전까지 i++시킨다.
여기서 inums요솟값이다.
nums에 첫 번째로 들어있는 값을 num1에 저장해야 하기 때문에 i의 초깃값을 0으로 잡아준다.


		//둘째 수 선택하는 for
        for ( int j = i+1; j < cntOfNums; j++ ) {
            num2 = nums[j];

3개의 수 중 두 번째 수를 선택하는 for문이다.
두 번째 수를 선택해야 하기 때문에 i의 다음 수인 i+1j의 초깃값으로 지정한다.
j또한 cntOfNums 이전까지 반복한다.
num2numsj 요솟값에 들어있는 값을 저장한다.


			//셋째 수 선택하는 for
            for ( int k = j+1; k < cntOfNums; k++ ) {
                num3 = nums[k];
                //선택된 3개의 수를 더한다.
                int sum = num1 + num2 + num3;
                //소수인지 확인
                if ( isPrime(sum)) {
                    answer++;
                }
            }

3개의 수 중 세 번째 수를 선택하는 for문이다.
세 번째 수를 선택해야 하기 때문에 i+1을 나타내는 j의 다음 수인 j+1k의 초깃값으로 지정한다.
k또한 cntOfNums 이전까지 for문을 반복한다.
num3nums[k]값을 저장한다.

이제 nums안에 있던 3개의 수가 각각 num1 num2 num3에 저장되었다. 이 세 변수들의 합을 구해 sum에 저장한다.
문제가 sum이 소수가 되는 경우의 수를 구하는 것이기 때문에 sum이 소수인지를 확인하는 메서드인 isPrime()을 만들고 sum 값을 준다.
만약 isPrime(sum)의 리턴값이 true라면 소수가 되는 경우의 수를 나타내는 answer의 값을 1 증가시킨다.


	//소수를 판별하는 메서드
    public boolean isPrime(int n) {
        boolean result = true;
        for ( int i = 2; i <= n/2; i++ ) {
            if ( n % i == 0) {
                result = false;
                break;
            }
        }
        return result;
    }

nums의 세 값의 합인 sum이 소수인지 아닌지를 판별하는 메서드이다.

소수인지 아닌지에 대한 결괏값을 저장할 result의 초깃값을 true로 지정한다.
solution함수에서 가져온 sum의 값은 n에 저장된다.

in을 나눌 용도로 쓰일 예정인데 i의 값이 1이라면 어느 값이든 나누어져 result에는 항상 false값이 저장되기 때문에 i의 초깃값은 2로 저장한다.
i의 값이 n이 될 때까지 나눌 필요 없이 n/2까지 될 때까지만 나누어도 n/2 이상의 약수는 나오지 않기 때문에 실행 속도를 증가시키기 위해 i <= n/2로 기술한다. 조건에 맞을 때까지 i++을 수행한다.

만약 n, 즉 세 수의 합계가 한 번이라도 i로 나누어진다면 n은 소수가 아니므로 resultfalse값을 저장한 후 breakfor문을 빠져나와 result값인 false를 리턴한다.
in/2가 될 때까지 ni로 나누어지지 않는다면 n은 소수가 맞으므로 초깃값 그대로 resulttrue로 리턴한다.


		return answer;

nums의 세 수의 합계가 소수가 되는 경우의 수를 리턴한다.

모든 for문을 다 돌아 모든 경우의 수를 구한 뒤 answer++된 값을 리턴한다.



profile
기록의 힘을 믿는 개발자, 노하은입니다!

0개의 댓글