문제 설명
주어진 숫자 중 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
접근법
- 랜덤으로 숫자 3개 고르기 + 더하기
- 소수인지 확인
- 맞다면 answer +=1
이렇게 접근하였지만 랜덤으로 숫자를 3개 고르면 중복되는 수를 어떻게 판별할 수가 없었다.
그러므로 랜덤으로 고를게 아니라 모든 3개 숫자의 조합을 추출하는 방향으로 가야했다.
- 모든 3개의 숫자의 조합
- 소수인지 확인
- 맞다면 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번째를 더하여 소수인지 확인하는 방법도 있다.
'⏰ 코딩테스트 > 프로그래머스' 카테고리의 다른 글
프로그래머스 2단계 - 문자열 반환 (0) | 2021.01.21 |
---|---|
프로그래머스 2단계 - 영어 끝말잇기 (0) | 2021.01.20 |
프로그래머스 2단계 - 짝지어 제거하기 (0) | 2021.01.18 |
프로그래머스 2단계 - 전화번호부 (0) | 2021.01.15 |
프로그래머스 2단계 - 행렬 곱 (0) | 2021.01.14 |