[문제 설명]
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.
[제한사항]
[입출력 예]
[입출력 예 설명]
입출력 예 #1
입출력 예 #2
나의 풀이
def solution(nums):
answer = 0 # 경우의 수
sum = [] # i+j+k 합 담을 리스트
for i in nums[:-2]: #1
for j in nums[nums.index(i)+1:-1]: #2
for k in nums[nums.index(j)+1:]: #3
sum.append(i+j+k)
for m in sum:
count = 0
for l in range(2,m):
if m % l != 0:
count += 1
if count == m-2:
answer += 1
return answer
nums에 있는 숫자들 중 서로 다른 3개(i,j,k)를 골라 더하기 위해 #1, #2, #3 for문의 리스트를 슬라이싱했다.
#1 : nums[:-2]
i의 범위를 뒤에서 두 번째 원소 전까지로 제한했다.
#2 : nums[nums.index(i)+1:-1]
i의 인덱스에 +1 하여 이전에 대입한 원소는 제외하고 뒤에서 첫 번째 원소까지 제한했다.
#3 : nums[nums.index(j)+1:]
j의 인덱스에 +1 하여 이전에 대입한 원소를 제외했다.
소수 : 1과 자기 자신만을 약수로 가지는 수
i+j+k를 2부터 m-1(=i+j+k-1)까지 나눠서 나머지가 0이 아닐 때 count에 1씩 더했다.
m에서 1과 m(=i+j+k) 자기 자신을 뺀 m-2와 count가 같을 때 answer에 경우의 수를 더했다.
문제를 풀면서 틀린 부분이 없는데 정확성이 23.1에서 향상되지 않아 고생했다. 질문하기에서 같은 사례가 있어 참고하여 맞출 수 있었다.
오답 해결하기!
지금까지 문제 중 가장 오래 걸렸다.😫
다른 사람의 풀이 #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