본문 바로가기
코딩테스트

[프로그래머스 Lv.1 / Java] 소수 만들기

by 지지 2022. 2. 7.

[문제]

소수 만들기

주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.

 

제한사항

● nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.

● nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.

 

입출력 예

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
셀 전체 선택
열 너비 조절
행 높이 조절
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을 만들 수 있습니다.


[풀이]

class Solution {
    public int solution(int[] nums) {
        int answer = 0;
        int count = 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++){
                    answer = nums[i] + nums[j] + nums[k];
                    if(isCheck(answer)){
                        count++;
                    }
                }
            }
        }
        return count;
    }

    private boolean isCheck(int num){
        for(int i = 2; i<num; i++){
            if(num%i == 0){
                return false;
            }
        }
        return true;
    }
}

 

1. 같은 배열 안에 있는 원소들을 각각 비교해주어야 하기 때문에 삼중for문을 썼고, 각 요소의 다음요소, 다다음요소를 비교해주어야해서 초기화식을 i=0, j=i+1, k=j+1로 써주었다.

2. answer변수에는 세 수를 모두 더한 값을 넣어 주었고, answer에 들어간 값은 isCheck 메서드를 통해 반환값이 true라면 count를 1씩 올라가게 해주었다.

- isCheck메서드는 세 수의 합을 매개변수로 받아 num을 다른 수랑 나누었을 때 0이 나온다면 소수가 아니기 때문에 소수일 때 true를 반환하도록 만들어 주었다.

- i의 범위가 2부터 num보다 작은 수인 이유는, 소수는 1과 자기자신으로만 나누어지는 수이기 때문에 1과 자기자신을 제외해야하기 때문이다.

3. 세 수의 합이 소수라면(true라면) count가 올라가기 때문에 세 수의 합이 소수인 경우의 수 count의 값을 최종 return해주었다.

 

● 다른 사람 풀이

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

        for (int a = 0; a < nums.length; a++) {
            for (int b = (a + 1); b <nums.length; b++) {
                for (int c = (b + 1); c < nums.length; c++) {
                    int sum = nums[a] + nums[b] + nums[c];
                    boolean confirm = true;
                    for (int i = 2; i < sum; i++) {
                        if (sum % i == 0) {
                            confirm = false;
                        }
                    }
                    if (confirm) answer++;
                }
            }
        }
        return answer;
    }
}

 

삼중 for문을 쓰는 방법밖에 생각이 나지 않아 이게 맞는 건가 싶어 많은 사람들의 코드를 둘러 보았는데, 거의 모든 사람이 삼중 for문을 쓴 것 같다.

위 코드는 따로 소수임을 확인하는 메서드와 count변수를 만들지 않았기에 참고용으로 가져와봤다.

 


[느낀점]

아직도 정녕 이 방법밖에 없는것인가 싶다!!! 분명 뭔가 방법이 있을 것 같은데ㅜㅜ 혼자 더 연구해보거나, 구글링으로 더 멋진 코드를 찾아낸다면 더 적어놔야지!

코딩테스트를 하면서 메서드를 따로 만든 건 이번이 처음인데, 사실 따로 메서드를 만드는게 더 좋은 방법인지, 아니면 위 다른사람 코드처럼 쓰는 게 더 좋은 방법인지 잘 모르겠다. 이 의문에 답이 있는지 없는지도 모르겠다.

빨리 코딩 천재가 돼서 효율적인 코드로 후루루룩룩루 문제를 풀고 싶다!

 

댓글