코딩테스트/PYTHON
[프로그래머스][PYTHON] Lv. 1 소수 만들기
_알파카
2024. 8. 22. 15:59
728x90
문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/12977
주어진 배열에서 숫자를 3개 골라 더한 값 중
소수의 개수를 구하는 문제이다.
첫 번째 풀이 (오답)
# 소수 구하는 함수
def find_num(num):
for i in range(2, int(num**0.5)+1):
# 소수가 아니면 break
if num % i == 0:
break
# 소수면 해당 숫자 반환
else:
return num
def solution(nums):
# 3개의 수를 더한 값을 저장할 set 선언
answer = set()
# 소수의 개수를 셀 count 변수
count = 0
# 3개의 수를 더함
for i in range(len(nums)):
for j in range(i+1, len(nums)):
for k in range(j+1, len(nums)):
number = nums[i] + nums[j] + nums[k]
# set은 중복을 제거함
answer.add(number)
answer = list(answer)
# 3개의 수를 더한 배열을 순회하며 소수를 찾음
for a in answer:
if find_num(a):
count += 1
return count
처음에 푼 풀이는 위와 같다.
1. 먼저, 3개의 수를 더한 값을 저장할 set을 선언한다.
2. 주어진 배열 nums에서 3개를 골라 수를 더하는 루프를 실행한다.
3. 앞서 선언한 set에 더한 값을 저장한다.
4. 이 후, 모든 더한 값을 순회하며 소수인지 판단한다.
그러나, 이 풀이는 23점 밖에 나오지 않는다.
그래서 어디가 문제가 될지 곰곰히 생각해보았다.
두 번째 풀이 (정답)
# 소수 구하는 함수
def find_num(num):
for i in range(2, int(num**0.5)+1):
# 소수가 아니면 break
if num % i == 0:
return False
# 소수면 해당 숫자 반환
else:
return True
def solution(nums):
# 소수의 개수를 셀 count 변수
count = 0
# 3개의 수를 더함
for i in range(len(nums)):
for j in range(i+1, len(nums)):
for k in range(j+1, len(nums)):
number = nums[i] + nums[j] + nums[k]
# 해당 수가 소수이면 count += 1
if find_num(number):
count += 1
return count
set을 사용하는 것이 꼭 필요 없을 것 같아 없애보았다.
그냥 3개를 골라 값을 더한 후, 이 값이 소수이면 바로 count에 1을 더하도록 하였다!
다른 사람 풀이
from itertools import combinations
def solution(nums):
answer = 0
for i in combinations(nums, 3):
s = sum(i)
chk = True
for j in range(2, int(s ** 0.5) + 1):
if s % j == 0:
chk = False
break
if chk is True:
answer += 1
return answer
itertools 라이브러리의 combinations를 사용해 숫자 3개를 선택하는 풀이이다!
나랑 전체적인 코드 흐름은 같지만,
좀 더 라이브러리를 효율적으로 활용한 풀이이다.
728x90