일단 answer는 0으로 초기값을 설정하고, combinations() 함수에 매개변수로 Solution() 함수의 매개변수인 nums와 그 중 3개를 뽑아서 더해야 하니 3을 넣어주고 for문을 돌린다
각 나오는 조합을 sum() 함수로 더해서 is_prime_number() 함수에 매개변수로 넣어서 if문을 만든다
if문에서 True가 나오면 answer에 값을 1씩 더해준다
이렇게 생각하고 고대로 코드를 짰더니 바로 풀렸다..!
전에 소수찾기 문제 풀 때 만들었던 is_prime_number() 함수에서 이번에는 math 라이브러리를 사용하지 않고 그냥 ** 연산자를 사용해서 제곱근을 구해줬다
<완성된 코드>
from itertools import combinations
def is_prime_number(number):
for i in range(2, int(number**0.5)+1):
if number % i == 0:
return False
return True
def solution(nums):
answer = 0
for i in combinations(nums, 3):
if is_prime_number(sum(i)):
answer += 1
return answer
print(solution([1, 2, 3, 4])) # 1
print(solution([1, 2, 7, 6, 4])) # 4
<다른 사람 풀이>
- 천재풀이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
이 사람은 for문 안에서 바로 소수를 판별했다
이 풀이를 가져온 이유는 for문과 else문이 같은 열에 있다는 특징때문이었다
else는 if문이랑만 쓰이는 줄 알았는데 찾아보니 for-else, while-else로도 사용된다고 한다
for문에서 쓰이는 else의 의미는 for문이 위에서 break 등으로 빠져나가지 않고 전부 돌면 else문이 실행되는 거다(while-else도 마찬가지임)
위 코드로 설명하자면 소수를 찾기 위한 2번째 for문이 돌다가 if문을 만나면 1과 자기 자신 외에 다른 숫자로 나눠진다는 뜻으로 break가 걸려 for문이 멈추게 된다
반대로 break 없이 for문이 다 돌았다면 1과 자기 자신 외의 다른 어떤 숫자로도 나누어 떨어지지 않는다는 뜻으로 즉, 소수라는 말이고 for문을 다 돌았으므로 else문이 실행돼서 answer에 1을 더해준다
위 풀이의 속도
소수 판별하는 for문을 돌릴 때 돌려지는 숫자의 제곱근만큼만 돌리면 되는데 이 풀이는 sum값을 그대로 다 돌려서 속도가 좀 느린 편이다
# 위 풀이에 소수 판별 시 돌려지는 숫자의 제곱근까지만 for문이 돌게끔 수정
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, int(cand**0.5)+1):
if cand%j==0:
break
else:
answer += 1
return answer