# Problem
문제 설명
주어진 숫자 중 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을 만들 수 있습니다.
# My Answer
def solution(nums):
answer = 0
odd = []
even =[]
prime = [i for i in range(2,3000)]
pr = prime.copy() # 지워줄 리스트
pp = [] # 소수 리스트
while prime:
p = prime[0]
pp.append(p) # 앞에서부터 하나씩 소수 넣어줌
for i in range(len(prime)):
if prime[i]%p==0: # 소수가 아니면 지워주기
pr.remove(prime[i])
prime = pr.copy()
# 리스트 중 홀 / 짝 나눠서 저장
for i in nums:
if i%2==0:
even.append(i)
else:
odd.append(i)
s=[]
# 홀홀홀
if len(odd)>=3:
for i in range(len(odd)):
for j in range(i+1,len(odd)):
for k in range(j+1,len(odd)):
if odd[i]+odd[j]+odd[k] in pp:
s.append(odd[i]+odd[j]+odd[k])
# 홀짝짝
for o in odd:
for i in range(len(even)):
for j in range(i+1,len(even)):
if o+even[i]+even[j] in pp :
s.append(o+even[i]+even[j])
return len(s)
3개를 더해서 나올 수 있는 최소의 수는 6
소수는 2 제외하고는 모두 홀수이다.
3개를 더해서 홀수가 되려면 홀+홀+홀 또는 홀+짝+짝 의 수를 더해야한다
주의해야할 점은 더해서 같은 수가 나오더라도 조합한 수가 다르면 다른 경우의 수로 생각해서 모두 합해주어야 한다.
# Solution 1 - itertools.combinations 활용
def solution(nums):
from itertools import combinations as cb
answer = 0
for a in cb(nums, 3):
cand = sum(a)
for j in range(2, cand):
if cand%j==0:
break
else:
answer += 1
return answer
itertools.combinations 활용하여 모든 3개 수의 합을 구한후
그 숫자보다 작은 모든수로 나누어보고 나누어 떨어지면 제외, 모든 수로 나누어떨어지지 않으면 answer+=1
# Solution 2
from itertools import combinations
def prime_number(x):
answer = 0
for i in range(1,int(x**0.5)+1):
if x%i==0:
answer+=1
return 1 if answer==1 else 0
def solution(nums):
return sum([prime_number(sum(c)) for c in combinations(nums,3)])
소수 판정법 - 해당 숫자의 루트 보다 작은 수들로 모두 나누어 떨어지지 않으면 소수이다.
prime_number함수 - answer값에 나누어 떨어지는 수 개수 저장하여 answer값이 1이면 True, 그 외에는 False반환
모든 수는 1로 나누어떨어지므로 answer>=1
'Algorithm > Programmers Lv.1' 카테고리의 다른 글
[2021 카카오 채용연계형 인턴십] 숫자 문자열과 영단어 (0) | 2021.07.27 |
---|---|
[찾아라 프로그래밍 마에스터] 폰켓몬 (0) | 2021.06.07 |
[2019 KAKAO BLIND RECRUITMENT] 실패율 (0) | 2021.06.07 |
[코딩테스트 연습] 2016년 (0) | 2021.06.06 |
[2021 Dev-Matching] 로또의 최고 순위와 최저 순위 (0) | 2021.06.05 |