문제 설명
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.
나의 풀이
def solution(n):
list = []
cnt = 0
for i in range(len(n)-2):
for j in range(i+1,len(n)-1):
for k in range(j+1,len(n)):
list.append(n[i]+n[j]+n[k])
ls =[i for i in list for j in range(2,i) if i%j == 0]
for i in list :
if i not in ls:
cnt+=1
return cnt
어려운 문제였다. 요구사항에서 내가 해결한 순서는 다음과 같다.
1. 주어진 숫자 배열 n 중 서로다른 3개를 골라 더한 모든 경우의 수 리스트에 저장하기
2. 위의 리스트에서 소수인 경우의 개수 찾기
우선 for문을 3회 중첩시켜 각기 다른 숫자 3개를 뽑아낼 수 있도록 범위를 지정했다.
[1 , 2 , 3, 4] 의 경우를 예를 들자면 서로 다른 숫자 3개의 경우의 수는
(1, 2, 3) , (1 ,2, 4 ) (1,3,4) ( 2, 3, 4) 총 네가지이다. 이때 규칙을 발견하는것이 어려웠는데 나의 경우에는 i , j, k라고 하면
i 자리에는 1 , 2 / j자리에는 a자리의 숫자를 제외한 2 , 3 / k 자리에는 3 , 4 가 반복적으로 들어갈 수 있도록 한다.
설명하려니 어려운데.. 인덱스 기준으로 설명하자면 (0 부터 시작 [0 1 2 3] 자리라고 생각)
결국 i 자리에는 range(len(n) - 2) = > 0 ,1 자리
j 자리에는 range(i+1, len(n)-1) = > i가 0일때는 1, 2 자리 , i 가 1일때는 2자리
k 자리에는 range(j+1, len(n)) = > j가 1일때는 2, 3 자리 j가 2일때는 3 자리
가 오게되며 각각의 자리수 대로 n 배열의 값을 더해 list라는 리스트에 넣어준다.
리스트에 넣은 값들 중 소수인 것의 개수를 구하는 방식은
list 내 for문을 통해 i 는 리스트의 값들 , j는 2부터 i-1값까지 나오도록해서 i 나누기 j의 나머지가 0인 경우( 나누어 떨어지는경우) 를 만족하면 리스트이 값 i를 ls라는 리스트에 넣어 전체 list의 값들 중 ls 에 없는 값이 있으면 cnt += 1을 하도록
또 다른 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, cand):
if cand%j==0:
break
else:
answer += 1
return answer
우선 combinations 라는 함수가 있다.
from itertools import combinations as cb로 한뒤 cb를 사용하였다 (별칭 지정 없이 그냥 combinations 써도 됨)
combinations는 조합을 구해주는 함수이다.
이런 함수가 있는것을 알았다면... 중첩 for 문을 세번돌리는 일이 없이 중복되지 않는 세 숫자의 합을 구할 수 있다.
그 다음 소수를 구할때 for - else 구문을 사용하였다.
for - else는 for문이 break등으로 중간에 빠져나오지 않고 끝까지 실행되었을때 else문이 실행되는 방식이다.
위에서는 0으로 나눠떨어져 break로 for문을 빠져나오지 않고 끝까지 실행되었을때 else문이 실행되며 answer += 1이 실행되는 것을 확인할 수 있다.
'프로그래머스' 카테고리의 다른 글
프로그래머스 MySQL Lv.4 보호소에서 중성화한 동물 (2) | 2023.11.23 |
---|---|
프로그래머스 MYSQL Lv.1 상위 n개 레코드 / 동명 동물 수 찾기 (2) | 2023.11.23 |
프로그래머스 Python Lv.2 영어 끝말잇기 / Lv.1 핸드폰 번호 가리기 (0) | 2023.11.22 |
프로그래머스 Python 모음제거 / x만큼 간격이 있는 n개의 숫자 (4) | 2023.11.22 |
프로그래머스 Python 최댓값 만들기 / Lv2 최댓값과 최솟값 (1) | 2023.11.20 |