log.Sehee
TIL / 3/23 / 프로그래머스 - 소수찾기 / Python 심화 본문
문제
프로그래머스의 소수 찾기 문제를 접해보았다.
시도
처음엔 0~9까지의 숫자를 랜덤하게 섞어서 도출해야 한다는 생각을 해서 이런 식을 세웠었다.
import random
def solution(numbers):
numbers = random.randint(0,9999999)
nums = set(range(numbers))
answer = filter(lambda x: x % x == 1 )(list(nums))
return answer
그런데 생각을 해보니 굳이 random.randint를 쓸 필요가 없이
어차피 range가 숫자의 범위를 전부 세어주고 list로 감싸면 순서대로 매겨지니 random을 써서 섞어줄 필요가 없었다.
그래서 전제조건이였던 1자리에서 7자리 이하인 숫자 조합,
9,999,999까지의 숫자 범위 내의 리스트 속에서 소수를 판별해내는 filter식을 세워보았다.
def solution():
num_list = list(range(2, 9999999))
numbers = filter(lambda x: x // (?) == x)(num_list)
print(numbers)
그런데 식을 세워놓고 잘못되었다는 것을 깨달았다.. 리스트에서 원소가 1개씩 순서대로 뽑혀 들어가는데 lambda식의 매개변수가 1개였던 것.. 이렇게 된다면 내부 조건식 내에서 자체적으로 소수를 판별해주는 식이 필요한데 그 비교 대상 식이 없다는 것이였다.
지금 위에 세워놓은 식은 본래 소수의 특성을 생각해 나눠지는 수가 1과 자기 자신인 x밖에 없다는 점만을 생각해서 넣은 조건이였지만.. 2 ~ 9,999,999까지 전부 대조해서 나누었을 때 몫이 1이여야 한다는 점을 놓치고 있었다. (?)자리에 num_list속의 모든 숫자를 한 번씩 모두 대입해보아야 한다는 점을..
추가로 식을 세우다가 아주 기초적인 것에서부터 헷갈리기 시작해서.. 나눗셈과 몫, 나머지의 값을 확실히 확인하기 위해서 실험을 했다...
f = [4 / 1, 4 // 1, 4 % 1] # 나눗셈, 몫, 나머지 순
g = [4 / 2, 4 // 2, 4 % 2]
h = [4 / 3, 4 // 3, 4 % 3]
i = [4 / 4, 4 // 4, 4 % 4]
print(f) # [4.0, 4, 0]
print(g) # [2.0, 2, 0]
print(h) # [1.3333333333333333, 1, 1]
print(i) # [1.0, 1, 0]
4는 소수가 아닌데 몫과 나머지로는 거를 수 있는 조건이 없었다.. 그렇다.. 소수의 특징 중 1과 자기자신만으로 나눌 수 있다는 특징으로 식을 세우기 위해서는 몫이나 나머지의 값을 활용할 것이 아니라 나눗셈을 활용해야 했던 것이였다.. 역시 기초를 탄탄히 하는게 뭐든 최고다.. ;p
해결
문제가 2레벨이기도 했고 시간도 너무 오래 걸렸어서 도중에 그만뒀다.. ;) ... 다음번에 재도전 하기루.. 책갈피... 꽂기...
배운 점
아래 블로그에서 '에라토스테네스의 체'라는 소수를 걸러내는 공식을 찾아내서 읽긴 했지만 머리에 과부하가 와서 그만두었다 ^^...
다음번에 풀 때 참고해서 풀어보아야겠다.