일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 1단계
- 2단계
- 프로그래머스
- Python
- cs
- STL
- test-helper
- 파이썬
- MySQL
- 코드수행
- 3단계
- 이것이 코딩테스트다 with 파이썬
- 머신러닝
- 그리디
- C++
- 구현
- ubuntu
- pytorch
- docker
- 실전알고리즘
- ssd
- 딥러닝
- AWS
- 모두를 위한 딥러닝 강좌 시즌1
- 백준
- 전산기초
- Object detection
- CS231n
- 자료구조 및 실습
- SWEA
- Today
- Total
곰퓨타의 SW 이야기
[프로그래머스 level2 소수만들기] itertools를 활용하고 이전에 풀었던 문제를 활용해보자 본문
오늘 해결할 문제는 이전에 풀었던 문제들과 굉장히 연관이 있다는 것을 알았다.
'소수만들기'라는 말을 보고 이전에 소수 찾기 문제를 풀었던 것이 기억났다 !
오늘 해결해야하는 문제는 다음과 같다.
programmers.co.kr/learn/courses/30/lessons/12977
코딩테스트 연습 - 소수 만들기
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때
programmers.co.kr
[문제 설명]
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.
[제한사항]
- nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
- nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.
[입출력 예]
nums | result |
[1,2,3,4] | 1 |
[1,2,7,6,4] | 4 |
3개의 수를 더했을 때를 가정하였기 때문에, 과거에 순열과 조합을 처리하던 itertools가 떠올랐다. 더하는 경우, 숫자의 순서는 상관이 없기 때문에 조합을 사용해야겠다는 생각을 하였다.
따라서, itertools에서 조합은 combinations이므로 이를 사용하여 list 형태로 저장하였다.
소수찾기 문제에서 가장 인상깊었던 풀이는 2부터 특정 숫자까지 '집합'형태로 넣어두고, 2부터 특정숫자까지 순회하면서 해당 수가 집합에 있는 경우, 그의 배수들을 집합에서 삭제하는 형태를 통해 소수를 찾았었다. (소수는 1과 자기자신 외에 약수를 가지지 않기 때문이다 ❗️)
이것을 응용하여 3개의 수를 뽑아서 더하는 경우는 주어진 전체 수를 더한 것 보다 작을 것이므로, 주어진 전체 수를 더한 범위에 존재하는 소수를 찾았다.
소수를 찾고 숫자 3개의 조합으로 이루어진 리스트를 더한 것이 소수라면 answer += 1을 해주는 형식으로 코드를 마무리하였다.
이러한 아이디어로 작성한 코드는 다음과 같다.
import itertools
def solution(nums):
answer = 0
combi_list = list(itertools.combinations(nums,3))
sum_nums = sum(nums)+1
sosu = set(range(2,sum_nums))
for i in range(2,sum_nums) :
if i in sosu :
sosu -= set(range(2*i,sum_nums,i))
for i in range(len(combi_list)) :
temp = sum(combi_list[i])
if temp in sosu :
answer += 1
return answer
오늘 itertools를 다시 돌아볼 수 있었고, 소수찾기에서 사용했던 알고리즘을 돌아볼 수 있었던 계기가 된 것 같다.
앞으로 활용할 일이 있다면 바로바로 접목할 수 있었으면 좋겠다 😊
'TIL > 프로그래머스' 카테고리의 다른 글
[프로그래머스 level2 뉴스 클러스터링] 문제를 넓게 보자! (0) | 2021.01.12 |
---|---|
[프로그래머스 level2 점프와 순간 이동] 수학적으로 접근하자! (0) | 2021.01.11 |
[프로그래머스 level2 짝지어 제거하기] 효율성 뿌시기! (0) | 2021.01.09 |
[프로그래머스 level2 수식 최대화] 차근차근 문제 해석하기 (0) | 2021.01.08 |
[프로그래머스 level2 행렬의 곱셈] 익혀두면 도움될 것 같은 식! (0) | 2021.01.04 |