문제 설명

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


제한사항

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

입출력 예


입출력 예 설명

입출력 예 #1
[1,2,4]를 이용해서 7을 만들 수 있습니다.

입출력 예 #2
[1,2,4]를 이용해서 7을 만들 수 있습니다.
[1,4,6]을 이용해서 11을 만들 수 있습니다.
[2,4,7]을 이용해서 13을 만들 수 있습니다.
[4,6,7]을 이용해서 17을 만들 수 있습니다.


코드

from itertools import combinations

def is_prime_number(x):
    for i in range(2, x):
        if x%i==0:
            return False
    return True

def solution(nums):
    answer = 0
    a = list(combinations(nums,3))
    for i in range(len(a)):
        
        if is_prime_number(sum(a[i]))==True:
            answer += 1
    return answer

접근법

  1. 랜덤으로 숫자 3개 고르기 + 더하기
  2. 소수인지 확인
    1. 맞다면 answer +=1

이렇게 접근하였지만 랜덤으로 숫자를 3개 고르면 중복되는 수를 어떻게 판별할 수가 없었다.

 

그러므로 랜덤으로 고를게 아니라 모든 3개 숫자의 조합을 추출하는 방향으로 가야했다.

  1. 모든 3개의 숫자의 조합
  2. 소수인지 확인
    1. 맞다면 answer +=1

소수 판별 함수

소수인지 확인하는 함수 is_prime_number()는 따로 만들어서 소수인지 판별하였다.

def is_prime_number(x):
    for i in range(2, x):
        if x%i==0:
            return False
    return True

3개의 수 추출

조합을 추출할 때는 itertools의 combination 라이브러리의 combinations() 함수를 이용하였다.

 

combinations() 함수는 리스트 안의 배열로 저장된다.

ex) [1,2,3,4] 를 넣으면 [(1,2,3), (1,2,4), (1,3,4), (2,3,4)]

 

 

for 문을 돌릴 때 

def solution(nums):
    answer = 0
    a = list(combinations(nums,3))
    for i in a:
        if is_prime_number(sum(a[i]))==True:
        answer += 1
    return answer

combinations() 함수를 통한 조합은 리스트 안의 배열들로 구성되어 있으므로

i에 리스트를 넣으면 

TypeError: list indices must be integers or slices, not tuple

에러가 난다.

 

따라서 

def solution(nums):
    answer = 0
    a = list(combinations(nums,3))
    for i in range(len(a)):
        
        if is_prime_number(sum(a[i]))==True:
            answer += 1
    return answer

리스트의 수만큼 반복해야 한다.

if문 뒤의 True는 써주지 않아도 된다.


* 다른 풀이

from itertools import combinations 
def check(a, b, c): 
    total = a + b + c
    for i in range(2, total): 
        if total % i == 0 : return False 
    return True 

def solution(nums):
    answer = 0
    A = list(combinations(nums, 3))
    for i in A: 
        if check(i[0], i[1], i[2]): answer += 1
    return answer

for문을 통해 리스트 A를 하나씩 i에 넣고

배열 i의 0번째, 1번째, 2번째를 더하여 소수인지 확인하는 방법도 있다.

복사했습니다!