<로직 고민>
- 일단 문제를 보자마자 든 생각은 지난 번에 풀었던 소수 찾기 문제에서 만들었던 is_prime_number() 함수를 사용해야겠다는 것이었다
- 그리고 팀원들이 힌트를 줬다 itertools 라이브러리를 써야겠다고
- 그래서..ㅎ...찾아봤다 알고리즘 문제 풀 때 많이 쓴다는데 지금 알아놔야 하지 않겠나 싶어서...!!!
- [파이썬] itertools 라이브러리 사용법 (순열, 조합)(permutations, combinations) - Python 문법 (tistory.com)
- 이 블로그를 참고했다
- 보니까 내가 필요한 건 중복없는 조합을 뽑는 combinations()함수였다
- 일단 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로도 사용된다고 한다
- 참고자료: 2.5 for-else와 while-else - 왕초보를 위한 Python: 쉽게 풀어 쓴 기초 문법과 실습 (wikidocs.net)
- 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
- 돌려지는 숫자의 제곱근까지만 돌리면 이렇게 속도가 확 줄어든다
- 바로 소수 판별을 하든 위에서 함수를 정의했든 속도는 비슷한 것 같다
- 입력 숫자에 따라 다른 듯?