문제
내 코드
from itertools import combinations
def solution(nums):
def sosu(n):
answer = False
if (n != 1):
cnt = 0
for i in range(2, n):
if (n % i == 0):
cnt += 1
if (cnt == 0):
answer = True
return answer
arr = []
for i in combinations(nums, 3):
arr.append(sum(i))
answer = 0
for a in arr:
if (sosu(a)):
print(a)
answer += 1
return answer
풀이
- 소수 판별 함수를 만든다.
- combinations 함수를 사용해서 합을 arr에 넣어준다.
- 소수면 카운트 한다.
효율적인 코드
from itertools import combinations
def sosu(n):
cnt = 0
if (n != 1):
for i in range(1, int(n**0.5)+1):
if (n % i == 0):
cnt += 1
return 1 if (cnt==1) else 0
def solution(nums):
return sum( [sosu(sum(j)) for j in combinations(nums, 3)] )
피드백
- 3중 for문을 써서 모든 조합의 합을 구하려고 했는데, itertools 라이브러리의 combination 함수를 쓰면 편리하다. (for문을 써도 돌아가는데 효율성이 떨어진다)
- 중복을 제거하고 배열에 추가했으나, 합이 같아도 구성 요소가 다르다면 배열에 추가해줘야 한다.
- 서로 다른 함수는 분리하기
- sosu(n) 함수의 반환값을 True/False 대신 1/0으로 설정하여, 리스트 컴프리헨션으로 바로 합계를 반환할 수 있다.
- return에도 if-else를 활용해서 변수 하나를 줄일 수 있다.
- 소수를 찾을 때 int(n**0.5)+1 을 사용하여 시간을 단축하자
배운 것
- combinations(배열, n) : 배열 내 모든 조합을 반환한다.
from itertools import combinations
combinations(배열, n)