Programmers - 소수 만들기(Python)
문제
- 주어진 숫자 중 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을 만들 수 있습니다.
✍ 코드
#(1)
import itertools
import math
def solution(nums):
# (2)
list_permutations = list(itertools.combinations(nums,3))
# (3)
store_sum_list = []
#(4)
for value in list_permutations:
sum_value = sum(value)
check_prime = 0
for i in range(2, int(math.sqrt(sum_value) + 1)):
if sum_value % i == 0:
check_prime += 1
if check_prime == 1:
break
if check_prime == 0:
store_sum_list.append(sum_value)
return len(store_sum_list)
nums = [1,2,7,6,4]
print(solution(nums)) # 출력 예 : 4
- (1) : 해당 문제는 itertools를 활용하여 풀었다. 특히 itertools의 combinations 메소드를 이용했다. 참고로 combinations 메소드는 중복조합을 사용할 때 쓰인다. 해당 문제는 주어진 리스트에서 3개의 수를 뽑아 이 3수를 더한 값이 소수인지 아닌지에 따라 결과값이 달라진다.
단순 조합일 경우 1, 2, 3 이렇게 3개의 수를 뽑았을 때 이것만 해도 조합의 수가 8개나 된다.
그러나 문제는 중복된 값도 일일이 count하는 것을 요구하는 것이 아니므로 순서만 다를 뿐 결과는 동일한 조합은 필요 없으므로 중복 조합을 활용하는 것이다.
- (2) : nums에서 3개의 수를 뽑아 중복 조합한 경우의 리스트를 담은 list_permutations
- (3) : 조합 안에서의 합이 소수일 경우 이 합을 담을 리스트 store_sum_list
- (4) : 리스트 list_permutations를 for문으로 돌면서 각 중복 조합 요소를 sum_value 변수에 합산하여 할당한다. check_prime은 sum_value가 소수인지 아닌지를 판별하기 위해 선언했다.
만약 check_prime이 1이 되는 순간 sum_value는 소수가 아니므로 안에 있는 for문을 break를 통해 탈출하며, 최종적으로 sum_value가 소수일 경우 sum_value를 store_sum_list에 append 해주었다. 최종적으로 구한 store_sum_list의 길이를 리턴해준다.
📝 결과
#(1)
import itertools
import math
def solution(nums):
# (2)
list_permutations = list(itertools.combinations(nums,3))
# (3)
store_sum_list = []
#(4)
for value in list_permutations:
sum_value = sum(value)
check_prime = 0
for i in range(2, int(math.sqrt(sum_value) + 1)):
if sum_value % i == 0:
check_prime += 1
if check_prime == 1:
break
if check_prime == 0:
store_sum_list.append(sum_value)
return len(store_sum_list)
nums = [1,2,7,6,4]
print(solution(nums)) # 출력 예 : 4
단순 조합일 경우 1, 2, 3 이렇게 3개의 수를 뽑았을 때 이것만 해도 조합의 수가 8개나 된다.
그러나 문제는 중복된 값도 일일이 count하는 것을 요구하는 것이 아니므로 순서만 다를 뿐 결과는 동일한 조합은 필요 없으므로 중복 조합을 활용하는 것이다.
만약 check_prime이 1이 되는 순간 sum_value는 소수가 아니므로 안에 있는 for문을 break를 통해 탈출하며, 최종적으로 sum_value가 소수일 경우 sum_value를 store_sum_list에 append 해주었다. 최종적으로 구한 store_sum_list의 길이를 리턴해준다.
😃 느낀점
- 문제를 봤을 때 조합을 생각했다. 다행히 파이썬에 이를 구현할 수 있는 itertools 라이브러리가 있었고, 이 안에서 조합을 활용할 수 있는 combinations() 메소드가 있었다. 덕분에 문제를 더 쉽게 해결할 수 있었다. 추후에 itertools 라이브러리에 대해 공부를 해봐야겠다.
👍 Irish의 모든 코드 보기
-> Irish Github
Author And Source
이 문제에 관하여(Programmers - 소수 만들기(Python)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@irish/Programmers-소수-만들기Python저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)