본문 바로가기
파이썬/파이썬 알고리즘

파이썬 프로그래머스 level 1. 소수 만들기

by Go! Jake 2021. 5. 25.
 
 

이전 글: 파이썬 프로그래머스 level 1. 2016년

이전 글: 파이썬 프로그래머스 level 1. 체육복

  문제

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

  풀이 - 1

def solution(nums):
    cnt=0
    total=[]
    for i in range(len(nums)):
        for j in range(i+1,len(nums)):
            for k in range(j+1,len(nums)):
                total.append(nums[i]+nums[j]+nums[k])

    for i in total:
        idx=0
        for j in range(1,i+1):
            if i%j==0:
                idx+=1
        if idx==2:
            cnt+=1
    return cnt

 

<1>

def solution(nums):
    cnt=0
    total=[]
    for i in range(len(nums)):
        for j in range(i+1,len(nums)):
            for k in range(j+1,len(nums)):
                total.append(nums[i]+nums[j]+nums[k])

위 i,j,k를 구성하여 3개의 숫자를 조합으로 더할 수 있게 하였다.

- i는 range(len(nums))로 nums에 있는 index를 모두 탐색 될 수 있도록 한다.

- j는 range(i+1, len(nums))로 i번째에서 선택한 값 그 다음 값을 사용한다.

-k는 range(j+1, len(nums))로 j번째에서 선택한 값 그 다음 값을 사용한다.

 

예를 들어, nums=[1,2,3,4] i,j,k의 결과값은 아래와 같이 구현된다.

>>> def solution(nums):
...     cnt=0
...     total=[]
...     for i in range(len(nums)):
...         for j in range(i+1,len(nums)):
...             for k in range(j+1,len(nums)):
...                 print(i,j,k)
...
>>> nums=[1,2,3,4]
>>> solution(nums)
0 1 2
0 1 3
0 2 3
1 2 3

이 때 len(nums) = 4가 된다.

참고로 예를 들어, i = 3인 경우 j와 k는 각각 4와 5부터 시작이 된다. 이 경우 for j in range(4,4): / for k in range(5,4):가 된다. 이 경우 계산이 되지 않으므로 결과적으로 i까지만 계산이 된다. 

 

최종 total.append(nums[i]+nums[j]+nums[k]) 계산이 for k in range(j+1,len(nums)): 아래에 있기 때문에, 맞지 않은 index는 계산되지 않는다.

 

<2>

    for i in total:
        idx=0
        for j in range(1,i+1):
            if i%j==0:
                idx+=1
        if idx==2:
            cnt+=1
    return cnt

for i in total: 을 통해 total에 저장된 3개의 수의 합을 하나하나 i를 통해 꺼낸다.꺼낸 후 range(1,i+1):을 통해 1에서부터 자기 자신의 숫자까지 나누고, i%j==0:을 통해 나머지가 0인지, 즉 나눠 떨어지는 지 본다.

이 때 총 나누어 떨어진 횟수가 2인 경우 소수로 인식하고, 이 값을 하나의 소수로 센다.

 

 

 

  풀이 - 2

import itertools

def solution(nums):
    cnt=0
    _combination=itertools.combinations(nums,3)
    total=[]
    for i in _combination:
        _sum=sum(i)
        total.append(_sum)
    
    for i in total:
        idx = 0
        for j in range(1, i+1):
            if i%j==0:
                idx+=1
        if idx==2:
            cnt+=1
    return cnt

itertools/combinations 함수를 사용하였다. 매번 자주 사용되는 조합 함수이므로 익혀두도록 한다.

combinations(iterable, 개수)로 사용하여, nums에 있는 숫자를 3개 조합한다.

 

for i in _combinations:를 통해 각 조합에 대한 값을 하나씩 가져올 수 있다.

이 때 i는 tuple 자료형으로 가져오게 된다. sum을 통해 더한 값을 구하고, total 리스트에 입력한다.

 

이후는 이전 코드와 동일하므로 생략한다.

 

 

댓글