Python/프로그래머스

[프로그래머스 lv.1] 소수 만들기

묘걍 2023. 8. 30. 16:57

문제

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

<제한사항>

  • nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
  • nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.

 

내가 생각한 풀이 방법

소수 판별하기

따로 함수 만들어(?)

매개변수 n을

for을 돌면서 range(0, n+1) 범위 내에서

n % i == 0이 되는 리스트 만듦

만약 그 리스트 내의 요소가 1과 n이면

True를 리턴

 

세개의 수 조합 만들기(더하기)

모르겠다...

삼중 for문을 사용하는걸 생각해봤는데

비효율적이기도 하고 중복이 생긴다.

(이 문제에서 1,2,3을 고른 것과 3,2,1을 고른 것은 같은거니까)

 

소수인 개수

세개의 수 조합 만들어 더한 결과 리스트를 소수 판별 함수를 거쳐

True일 경우 +=1 해줌

코드로 구현

1차 시도

def is_prime_num(n):
    for i in range(1, n+1):
        p_num = []
        if n % i == 0:
            p_num.append(i)
        if len(p_num) == 2:
            return True

from itertools import combinations
def solution(nums):
    answer = -1
    comb = []
    comb_sum = []
    
    comb = combinations(nums,3)
    for i in comb:
        comb_sum.append(sum(i))
    
    for i in comb_sum:
        if is_prime_num(i):
            answer += 1

    return answer

- 소수 구하는 부분에서 p_num[]을 for문 안에 넣으면 매번 초기화되므로 빼줘야한다

- 찾아보니 combinations()라는 함수가 있어서 그것을 활용했다

 

2차 시도

def is_prime_num(n):
    p_num = []
    for i in range(1, n+1):
        if n % i == 0:
            p_num.append(i)
        if len(p_num) == 2:
            return True

from itertools import combinations
def solution(nums):
    answer = -1
    comb = []
    comb_sum = []
    
    comb = combinations(nums,3)
    for i in comb:
        comb_sum.append(sum(i))
    
    for i in comb_sum:
        if is_prime_num(i):
            answer += 1

    return answer

- p_num 위치만 바꿔줌

- 소수 판별 함수에서 소수가 아닌 경우를 고려하지 않음(?)

 

3차 시도

def is_prime_num(n):
    p_num = []
    for i in range(1, n+1):
        if n % i == 0:
            p_num.append(i)
        if len(p_num) == 2:
            return True
        else:
            return False

from itertools import combinations
def solution(nums):
    answer = -1
    comb = []
    comb_sum = []
    
    comb = combinations(nums,3)
    for i in comb:
        comb_sum.append(sum(i))
    
    for i in comb_sum:
        if is_prime_num(i):
            answer += 1

    return answer

- false 부분 추가해줌

 

4차 시도

from itertools import combinations
def is_prime_num(n):
    p_num = []
    for i in range(1, n+1):
        if n % i == 0:
            p_num.append(i)
    return len(p_num) == 2

def solution(nums):
    answer = 0
    comb = []
    
    comb = combinations(nums,3)
    
    for i in comb:
        if is_prime_num(sum(i)):
            answer += 1

    return answer

- return에 바로 True 조건을 넣어서 저 조건에 해당하면 True 아니면 False를 반환하도록

- comb_sum을 따로 for문 돌리지 말고 comb를 for문 돌면서 그 for문 안에서 sum 해줘가면서 검사

 

다른 사람 풀이