Coding Test/Programmers
소수 찾기 - 프로그래머스 - 파이썬 풀이
심재훈
2019. 8. 19. 19:00
문제 풀이
문제 자체는 매우 간단합니다.
예시도 두 가지로 직관적입니다.
하지만 숫자 길이가 길어지면 시간 초과가 날 확률이 높습니다.
따라서 문제를 잘 이해하고 최적화할 부분을 찾는게 중요합니다.
풀이 과정
- 소수가 될만한 후보를 찾습니다.
- 완전 탐색이 여기서 쓰입니다.
- permutations
- 완전 탐색이 여기서 쓰입니다.
- 이 후보가 소수인지 확인합니다.
- 이 부분을 최적화해야 합니다!!
- 소수인지 판별하는 다양한 알고리즘을 구현해 이 부분만 수정합니다.
- 이런 기본적인 함수는 인터넷에 최적화 되어있는 코드가 많이 있습니다. 검색해서 활용합시다!
클린 코드 작성법
- 변수명을 고쳐 문제의 이해력을 높입니다.
- number_string
- 문제의 단계별로 함수화합니다.
- get_candidates
- check_prime
- 문제를 풀어나갈 때, 과정을 잘게 쪼개면 최적화하기 쉽습니다.
- 오래 걸리면서 반복적으로 쓰이는 check_prime 함수만 최적화하면 됐습니다.
해답 코드
from itertools import permutations
import math
def solution(numbers):
number_string = numbers
number_list = []
for string in number_string:
number_list.append(int(string))
candidates = get_candidates(number_list)
prime_count = 0
for candidate in candidates:
is_prime = check_prime(candidate)
if is_prime:
prime_count += 1
return prime_count
def get_candidates(number_list):
candidates = []
length = len(number_list)
for r in range(1, length + 1):
candidates += permutations(number_list, r)
final_candidates = set([])
for candidate in candidates:
transformed = tuple_to_int(candidate)
final_candidates.add(transformed)
return final_candidates
def tuple_to_int(tuple_):
result = 0
digit = 1
for integer in tuple_:
result += integer*digit
digit *= 10
return result
def check_prime(number):
if number <= 1:
return False
if number % 2 == 0 and number > 2:
return False
return all(number % i for i in range(3, int(math.sqrt(number)) + 1, 2))
도움이 됐다면 공감버튼을 눌러주세요! 질문이 있다면 댓글 달아주세요!
코딩테스트 연습 - 소수 찾기 | 프로그래머스
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요. 제한사항 numbers는 길이 1 이상 7 이하인 문자열입니다. numbers는 0~9까지 숫자만으로 이루어져 있습니다. 013은 0, 1, 3 숫자가 적힌 종이
programmers.co.kr