소수 만들기

신연우·2021년 2월 26일
0

알고리즘

목록 보기
48/58
post-thumbnail

프로그래머스 - 소수 만들기

문제 설명

주어진 숫자 중 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

접근

조합으로 풀면 모든 조합 가능한 경우에 대해 조합의 경우를 구할 수 있을 것이다. 그렇게 구한 조합 가능한 수들의 집합을 각각 더해 만든 숫자들을 대상으로 소수인지 아닌지 검사하면 풀 수 있을 것이다.

풀이

from itertools import combinations
from math import sqrt


def solution(nums):
    nums = list(map(sum, combinations(nums, 3)))
    answer = len(nums)

    for num in nums:
        for x in range(2, int(sqrt(num)) + 1):
            if not num % x:
                answer -= 1
                break

    return answer

해결 과정

combinations를 통해 조합 기능을 사용하고, 이때 구해진 조합 수들에 대해 sum으로 맵핑해서 더해진 값들을 가져온다.

이후 answer에 먼저 nums의 길이를 저장한 후 nums에서 하나씩 수를 가져와 그 수가 소수라면 answer의 값을 1 감소시키는 것으로 정답을 구해나갔다.

다른 사람의 풀이

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

위와 같이 for ... else 구문을 이용하여 answer의 값을 구할 수도 있다. 또한, map을 사용하지 않고도 위와 같이 따로 구할 수도 있다.

profile
남들과 함께하기 위해서는 혼자 나아갈 수 있는 힘이 있어야 한다.

0개의 댓글