Programmers - 소수 만들기(Python)

문제

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

제한사항

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

입출력 예

numsresult
[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의 길이를 리턴해준다.

📝 결과

😃 느낀점

  • 문제를 봤을 때 조합을 생각했다. 다행히 파이썬에 이를 구현할 수 있는 itertools 라이브러리가 있었고, 이 안에서 조합을 활용할 수 있는 combinations() 메소드가 있었다. 덕분에 문제를 더 쉽게 해결할 수 있었다. 추후에 itertools 라이브러리에 대해 공부를 해봐야겠다.

👍 Irish의 모든 코드 보기

-> Irish Github

좋은 웹페이지 즐겨찾기