이전 글: 파이썬 프로그래머스 level 1. 2016년
문제
주어진 숫자 중 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 리스트에 입력한다.
이후는 이전 코드와 동일하므로 생략한다.
'파이썬 > 파이썬 알고리즘' 카테고리의 다른 글
[swea - 파이썬] 2047. 신문 헤드라인 (0) | 2021.07.14 |
---|---|
[swea - 파이썬] 2058. 자릿수 더하기 (0) | 2021.07.13 |
파이썬 코드업 6043번 6043 : [기초-산술연산] 실수 2개 입력받아 나눈 결과 계산하기(py) (0) | 2021.05.06 |
파이썬 코드업 6042번 6042 : [기초-값변환] 실수 1개 입력받아 소숫점이하 자리 변환하기(설명)(py) (0) | 2021.05.05 |
파이썬 프로그래머스 level 1. 2016년 (0) | 2021.05.04 |
댓글