Light Blue Pointer
본문 바로가기
Coding Test

[프로그래머스]소수 만들기

by Greedy 2023. 11. 29.

문제 주소

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

 

프로그래머스

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

programmers.co.kr

문제 설명

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

풀이과정

엥 어떤 수가 소수인지 알려면 그 밑의 수로 다 나눠봐야 되는건가요

제곱근까지 약수를 구해보도록 해요

ijk 세 포인터를 옆으로 옮겨가면서 하나씩 세서 세 수 조합 만들기로 함

import java.lang.Math;
class Solution {
    public int solution(int[] nums) {
        int answer = 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++){
                    int num = nums[i]+nums[j]+nums[k];
                    
                    int isPrime = 0;
                    for(int l=2; l<Math.sqrt(num) ;l++){
                        if(num%l == 0){
                            isPrime++;
                            break;
                        }
                    }
                    if(isPrime==0){
                    answer++;
                    }
                    
                }
            }
        }
        return answer;
    }
}
테스트 1입력값 〉[1, 2, 3, 4]기댓값 〉1실행 결과 〉실행한 결괏값 2이 기댓값 1과 다릅니다.테스트 2입력값 〉[1, 2, 7, 6, 4]기댓값 〉4실행 결과 〉실행한 결괏값 5이 기댓값 4과 다릅니다.

코드를 다시 살펴보니까

Math.sqrt(num) 이부분이 소수면 애매할 거 같았음

for(int l=2; l<Math.sqrt(num)+1 ;l++){
                        if(num%l == 0){
                            isPrime++;
                            break;
                        }
                    }

+1 해줬더니 통과함

제출 코드

import java.lang.Math;
class Solution {
    public int solution(int[] nums) {
        int answer = 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++){
                    int num = nums[i]+nums[j]+nums[k];
                    
                    int isPrime = 0;
                    for(int l=2; l<Math.sqrt(num)+1 ;l++){
                        if(num%l == 0){
                            isPrime++;
                            break;
                        }
                    }
                    if(isPrime==0){
                    answer++;
                    }
                    
                }
            }
        }
        return answer;
    }
}

→ 2023-11-30에 다른 문제에서 해보니까 소수를 저렇게 세면 문제생겨서

l<Math.sqrt(num)+1 → l≤Math.sqrt(num)

코드 수정함

import java.lang.Math;
class Solution {
    public int solution(int[] nums) {
        int answer = 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++){
                    int num = nums[i]+nums[j]+nums[k];
                    
                    int isPrime = 0;
                    for(int l=2; l<=Math.sqrt(num);l++){
                        if(num%l == 0){
                            isPrime++;
                            break;
                        }
                    }
                    if(isPrime==0){
                    answer++;
                    }
                    
                }
            }
        }
        return answer;
    }
}