Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- SKU Consolidation
- 딥러닝
- ABC Analysis
- MySQL
- oracle
- SQL
- tensorflow
- Labor Management System
- 프로그래머스
- forecast
- TensorFlowGPU
- pandas profiling
- eda
- 코딩테스트
- ProfileReport
- 파이썬
- 당신의 인생이 왜 힘들지 않아야 한다고 생각하십니까
- ModelCheckPoint
- 데이터분석
- 코딩테스트연습
- 피그마인디언
- leetcode
- 웨어하우스 보관 최적화
- 신경쓰기의 기술
- Gaimification
- MS SQL Server
- HackerRank
- kaggle
- Inventory Optimization
- Product Demand
Archives
- Today
- Total
오늘도 배운다
소수 만들기 / 프로그래머스, 파이썬 코딩테스트 연습 Summer/Winter Coding(~2018) 본문
코딩테스트연습(파이썬)
소수 만들기 / 프로그래머스, 파이썬 코딩테스트 연습 Summer/Winter Coding(~2018)
LearnerToRunner 2023. 1. 2. 14:18문제
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.
제출답안
def solution(nums):
answer = 0
result = dict() # 세 수의 합과 카운트를 담을 딕셔너리
# 주어진 배열의 경우의 수 구하기
for i, n1 in enumerate(nums):
for j, n2 in enumerate(nums[i+1:]):
for n3 in nums[i+1:][j+1:]:
sum_nums = n1+n2+n3 # 세 수의 합
# 1이상 자연수 3개를 합할 경우 무조건 2 이상.
# 2이상 짝수에는 소수가 없다. 짝수합은 제외하여 경우의 수 줄이기
if sum_nums % 2: # 합이 짝수가 아닌 경우
if sum_nums in result: # 홀수인 합이 딕셔너리에 있을경우
result[sum_nums] += 1 # 카운트 1 추가
else:# 홀수인 합이 딕셔너리에 없을 경우
result[sum_nums] = 1 # 카운트 1로 설정
set_nums = set(result.keys()) #딕셔너리 내 key, 소수들의 집합 생성
max_num = max(set_nums)# 가장 큰 소수
# 에라토스테네스의 체 홀수버전
for i in range(3, max_num+1, 2): # range: 3 이상 result 최대값 이하의 모든 홀수
multiple = set(range(i*2,max_num + 1, i)) # 각 홀수의 배수 집합
set_nums -= multiple # result와 배수집합의 차집합 >> 결과적으로 배수가 없는 값 즉 소수만 남음
# 각 소수의 카운트 횟수 더하기. 즉 경우의 수
for prime_sum in set_nums:
answer+=result[prime_sum]
return answer
이전에 풀었던
소수찾기에서 배운 소수탐지 알고리즘 사용
두 개 뽑아서 더하기에서 배운 조합 알고리즘 사용
하지만 지속적으로 런타임 에러 발생
개선답안
세 자연수의 합을 담는 딕셔너리 result가 비어있거나
홀수 합을 담은 집합 set_nums가 비어있을 경우
런타임 에러가 발생
따라서 result 또는 set_nums가 비었을 경우
answer을 0으로 리턴하도록 처리함
def solution(nums):
answer = 0
result = dict() # 세 수의 합과 카운트를 담을 딕셔너리
# 주어진 배열의 경우의 수 구하기
for i, n1 in enumerate(nums):
for j, n2 in enumerate(nums[i+1:]):
for n3 in nums[i+1:][j+1:]:
sum_nums = n1+n2+n3 # 세 수의 합
# 1이상 자연수 3개를 합할 경우 무조건 2 이상.
# 2이상 짝수에는 소수가 없다. 짝수합은 제외하여 경우의 수 줄이기
if sum_nums % 2: # 합이 짝수가 아닌 경우
if sum_nums in result: # 홀수인 합이 딕셔너리에 있을경우
result[sum_nums] += 1 # 카운트 1 추가
else:# 홀수인 합이 딕셔너리에 없을 경우
result[sum_nums] = 1 # 카운트 1로 설정
if len(result):
set_nums = set(result.keys()) #딕셔너리 내 key, 소수들의 집합 생성
max_num = max(set_nums)# 가장 큰 홀수
# 에라토스테네스의 체 홀수버전
for i in range(3, max_num+1, 2): # range: 3 이상 result 최대값 이하의 모든 홀수
multiple = set(range(i*2,max_num + 1, i)) # 각 홀수의 배수 집합
set_nums -= set(range(i*2, max_num+1, i)) # result와 배수집합의 차집합 >> 결과적으로 배수가 없는 값 즉 소수만 남음
if set_nums == {*()}:
break # set_nums
if set_nums != {*()}:
# 각 소수의 카운트 횟수 더하기. 즉 경우의 수
for prime_sum in set_nums:
answer+=result[prime_sum]
return answer
개선 전수 성능 비교
획득점수
3점
문제 바로가기
728x90
'코딩테스트연습(파이썬)' 카테고리의 다른 글
개인정보 수집 유효기간 / 프로그래머스, 파이썬 코딩테스트 연습2023 KAKAO BLIND RECRUITMENT (0) | 2023.01.08 |
---|---|
[1차] 비밀지도 / 프로그래머스, 파이썬 코딩테스트 연습2018 KAKAO BLIND RECRUITMENT (0) | 2023.01.07 |
두 개 뽑아서 더하기 / 프로그래머스, 파이썬 코딩테스트 연습 월간 코드 챌린지 시즌1 (0) | 2023.01.02 |
키패드 누르기 / 프로그래머스, 파이썬 코딩테스트 연습 2020 카카오 인턴십 (0) | 2022.12.31 |
3진법 뒤집기/ 프로그래머스, 파이썬 코딩테스트 연습 월간 코드 챌린지 시즌1 (2) | 2022.12.30 |
Comments