[5/27] 소수 만들기

이경준·2021년 5월 27일
0

코테

목록 보기
19/140
post-custom-banner

문제

내 코드

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

풀이

  1. 소수 판별 함수를 만든다.
  2. combinations 함수를 사용해서 합을 arr에 넣어준다.
  3. 소수면 카운트 한다.

효율적인 코드

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)
profile
The Show Must Go On
post-custom-banner

0개의 댓글