made by ME
#입력: nums(정수 배열)
#출력: answer(3개 수의 합이 소수가 되는 경우의 수)
def solution(nums):
answer = 0
length = len(nums)
for i in range(length-2): #0 ~ nums-3
for j in range(i+1, length-1): #i+1 ~ nums-2
for k in range(j+1, length): #j+1 ~ nums-1
number = nums[i]+nums[j]+nums[k]
if not(number%2): # 짝수라면 건너뛰기!
continue # break 대신 순번 건너뛰기만
# 홀수라면 소수 검사만!
for l in range(2,int(number**0.5)+1):
temp = True
if not(number%l):
temp = False
break
if temp:
answer +=1
return answer
Gemini 피드백
1) temp 같은 flag 변수 대신 for-else 구문 활용하기
if-else vs. for-else 차이 (else가 실행되는 기준)
if-else: if 조건식이 거짓(false)일 때 실행
for-else: for 반목문이 중간에 break를 만나지 않고 끝까지 완료되었을 때 실행 ▶ 따라서 for-else 구문에서 반복문이 조기 종료(break)되지 않았다면 else가 실행된다.for-else는 왜 있는 걸까?
: 반복문이 중간에 멈추지 않고 끝까지 다 돌았는지 체크하기 위해굳이 변수를 하나 더 만드는 게 번거롭다라고 생각했기 때문이라고 한다.(역시 효율을 추구하는 개발의 세계..)
Gemini가 말하는 최고의 코드
from itertools import combinations
def is_prime(n):
# 2보다 작은 수는 소수가 아님
if n < 2:
return False
# 2부터 제곱근(√n)까지만 나누어 떨어지는지 검사
for i in range(2, int(n**0.5)+1):
if n % i == 0:
return False
return True
def solution(nums):
answer = 0
#1. nums에서 3개를 뽑는 모든 조합 구하기
for comb in combintions(nums, 3):
#2. 3개 수의 합이 소수인지 검사
if is_prime(sum(comb)):
answer += 1
return answer
is_prime 함수로 별도 분리 해서 메인 로직(solution) 함수가 훨씬 직관적으로 읽힌다.itertools.combinations 내장 모듈을 활용함으로써 실수를 줄일 수 있고, C언어 수준으로 최적화 되어 있어 실행 속도도 훨씬 빠르다고 한다.