[프로그래머스 summer/winter Coding ~2018] 소수 만들기
문제 설명
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.
제한사항
소수가 되는 경우의 수를 체크해 주기 위해서 먼저 소수인지 체크해주는 함수를 작성했다. sieve를 사용할 수도 있지만.. 나는 왜인지 모르게 sieve를 별로 좋아하지 않기 때문에..! 그냥 함수를 이용해서 짰다.
def checkPrime(number):
flag = True
if (number > 1):
factor = 1
while (factor < number-1):
factor += 1
if (number % factor == 0):
flag = False
return flag
무식하게 prime number인지 다 확인을 했다면 이제 주어진 array에서 3개의 숫자를 뽑아서 계산을 해볼 시간이다.
나는 For loop을 세개 이용했는데, 좀.. 어지러워보여서 다른 방식을 알게된다면 다른 방식으로 해보고 싶다.
def solution(nums):
prime = []
for i in range(len(nums)):
for j in range(i+1, len(nums)):
for k in range(j+1, len(nums)):
sum = nums[i]+nums[j]+nums[k]
if checkPrime(sum):
prime.append(sum)
# answer= []
# [answer.append(x) for x in prime if x not in answer]
return len(prime)
코멘트 해둔 두개의 줄은.. 내가 문제를 '소수를 return 하는 경우의 수' 로 읽지 않고 '결과값으로 나오는 소수의 종류의 개수' 쯤으로 이해해서 중복되는 소수를 전부 제거했기 때문이다. 예를 들어서 prime array = [3,7,11,3,7] 이었을때 [3,7,1]만 리턴하는 식으로..
테스트케이스는 전부 잘만 돌아가는데 막상 제출하기 누르면 계속 테스트 오류 뜨길래 내가 이상한가 했는데.. 그냥 문제만 잘못읽은거였던걸루,, ㅎㅎ,,
다음엔 문제를 잘 읽어보자
레벨 1인데 왜이렇게 어렵나 진짜 오래 고민했네 휴
def solution(nums):
from itertools import combinations as cb
answer = 0
for a in cb(nums, 3):
cand = sum(a)
for j in range(2, cand):
if cand%j==0:
break
else:
answer += 1
return answer
combinatorics를 사용한 풀이가 자주 보여서 추가한다 나는 for loop을 세번 중첩했는데, combinatorics를 이용하면 간단하게 할 수 있는거였다.
checkPrime 함수에 대해서도 간단하게 forloop 안에서 활용할 수 있는거였다 오늘도 이렇게 한수 배워갑니다...가야할 길이 너무 멀다