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 해줘가면서 검사
다른 사람 풀이