[Java] 소수 만들기 (programmers)

Haeun Noh·2023년 7월 18일
0

programmers

목록 보기
57/64
post-thumbnail

0718


문제 설명

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


풀이 방식

이 문제는 주어진 배열 속의 숫자 3개로 자신 또는 1로밖에 나누어지지 않는 소수를 만들 수 있는 경우의 수를 구하는 문제입니다.

저는 다음과 같은 방법으로 이 문제를 해결하였습니다.

  1. 배열 안에 들어있는 서로 다른 세 개의 수의 합을 구합니다.
  2. 합이 소수인지 판별합니다.
  3. 판별한 값이 true일 경우 answer1 증가시켜 소수가 될 수 있는 경우의 수를 구합니다.

그럼 더 코드를 같이 보며 더 자세한 풀이를 남겨보도록 하겠습니다.


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

nums배열 속의 숫자 3개의 합이 소수인 경우의 수를 저장할 answer0으로 초기화하여 준비합니다.


        for ( int i = 0; i < nums.length; i++) {
            for ( int j = i+1; j < nums.length; j++) {
                for ( int k = j+1; k < nums.length; k++) {
                    int sum = nums[i]+nums[j]+nums[k];
                    if ( isPrime(sum) ) {
                        answer++;
                    }
                }
            }
        }

        return answer;

다른 세 수의 합을 구하고, 만약 합이 소수라면 answer1 증가시키는 부분입니다.

for문을 세 개 준비함으로써 nums안의 각각 다른 수들의 합을 구할 수 있도록 합니다.

sum을 구한 뒤 메서드 isPrime()의 리턴값이 true라면 sum이 소수라는 의미이므로 answer1 증가시킵니다.

모든 경우의 수를 다 구하였다면 for문을 빠져나온 뒤


    public boolean isPrime(int num) {
        boolean isPrime = true;
        for ( int i = 2; i <= num/2; i++) {
            if ( num % i == 0) {
                isPrime = false;
                break;
            }
        }
        return isPrime;
    }

이 문제의 핵심인 소수인지 판별하는 부분입니다.

메서드로 구현한 이유는 if문으로 더 간결하게 표현하기 위해서는 리턴값이 있는 메서드를 따로 구현하는 것이 나을 것 같았고, 가독성을 더 좋게 하기 위함이었습니다.

소수인지를 판별할 변수인 isPrime의 초깃값은 true로 잡았고, 그 이유는 만약 numi로 나누어진다면 소수가 아니라는 것이므로 false로 값을 변경하기 위함입니다.
그리고 쓸데없는 for문의 낭비를 방지하기 위해서 소수가 아닌 것이 판별된다면 바로 break를 걸어 for문을 빠져나오게 하였고, num/2까지만 for문이 돌게 하였습니다.


여기서 주의할 점은 int i의 초깃값을 2부터 시작해야 한다는 것입니다.

저는 무심코 i의 초깃값을 1부터 시작하게 되었는데 이 때는 실행 결과가 전부 0으로 나왔습니다.
그 이유는 어떤 수던지 1로는 나누어지기 때문에 isPrime이 바로 false로 바뀌게 된 것입니다.

소수는 1과 자기자신으로만 나누어질 수 있는 수이기 때문에 1을 제외한 2부터 시작해야합니다.
명심해주세요!



소스 코드

class Solution {
    public int solution(int[] nums) {
        int answer = 0;
        
        for ( int i = 0; i < nums.length; i++) {
            for ( int j = i+1; j < nums.length; j++) {
                for ( int k = j+1; k < nums.length; k++) {
                    int sum = nums[i]+nums[j]+nums[k];
                    if ( isPrime(sum) ) {
                        answer++;
                    }
                }
            }
        }

        return answer;
    }
    
    public boolean isPrime(int num) {
        boolean isPrime = true;
        for ( int i = 2; i <= num/2; i++) {
            if ( num % i == 0) {
                isPrime = false;
            }
        }
        return isPrime;
    }
} 


실행 결과



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

0개의 댓글