Algorithm/프로그래머스

세무민의 알고가자 : 프로그래머스의 소수 만들기 문제 풀이

세기루민 2021. 3. 10. 22:45
728x90

이번에 풀어 볼 문제는 소수 만들기!

이번 문제는 Summer/Winter Coding 2018년도 문제 중 1개라고 합니다.

무튼 풀어보죠


문제 설명 및 입출력 예시


풀이

이번 문제는 사실 itertools를 사용한다면 10분정도에 풀 수 있었던 문제라고 생각됩니다.

처음에는 당황했던 부분은 3개를 조합한 뒤 그 값이 소수인지 판별하는 것!

그렇지만 itertools에 있는 combinations을 이용한다면 쉽게 풀 수 있었습니다.

 


combinations?

우선 combinations를 설명하면 조합이라고 생각하면 됩니다.

즉 배열에 존재하는 값을 선택하여 조합해주는 것을 말하죠 

즉 arr[1,2,3] -> list(combinations(arr, 2))라고 가정하면 

result = [1,2], [1,3], [2,3]의 결과값을 가져올 수 있습니다.

백마디의 말보다 한번 코드를 만드는게 더 쉽겠죠? 

무튼 풀이를 요약하면!

1. combinations을 이용하여 조합을 생성해준다.

2. 생성된 조합을 sum()을 이용하여 합하여 새로운 list에 넣어준다.

3. 조합된 리스트를 하나씩 소수인지 판별해주면 끝!


코드

import itertools
from itertools import permutations

def solution(num):
    numbers = []
    answer = 0
    nums = list(itertools.combinations(num, 3))
    for i in range(len(nums)):
        numbers.append(sum(nums[i]))

    for i in numbers:
        count = 2
        for j in range(2, i):
            if i % j == 0:
                continue
            else:
                count+=1

        if count == i:
            answer += 1

    return answer

코드는 위와 같이 만들었습니다.

사실 소수 판별에는 제곱근을 이용하는 방식도 있으나 혹시 몰라서 하나씩 비교해줬습니다.

여기서 count가 왜 있는지 궁금하실 수 있는데 

count는 해당 값이 소수인지 판별하기 위해 사용했는데요 

count값이 기존 i값과 일치하다면? 소수가 아니라는 의미를 가집니다.

그 이유는 나눠지는 값이 없다면 count의 증가가 결국 i값과 일치하기 때문이죠 

끝!


이번 문제가 막 어려운건 아니였지만

기초를 한번 더 상기시킬 수 있었던 문제라서 좋았네요 ㅎㅎ

무튼 다음에도 다른 알고리즘으로 찾아오겠습니다.

 

728x90