Marais.lee
Welcome to Marais's IT Home
Marais.lee
전체 방문자
오늘
어제
  • 분류 전체보기 (87)
    • co-task 프로젝트 (7)
    • Study (28)
      • 자바스크립트 (5)
      • 모던 리액트 Deep Dive (7)
      • 용어 (1)
      • 컴퓨터과학 (2)
      • 코테 (12)
      • 네트워크 (0)
    • 개발 환경 (3)
    • Next.js (pages router) (9)
    • Next.js (app router + 14v) (4)
    • TypeScript (11)
    • 라이브러리 (8)
    • 후기 및 고민 (10)
    • 맥북관련 셋팅 및 오류 (4)
    • Obsidian | 옵시디언 (1)
반응형

인기 글

최근 글

블로그 메뉴

  • 홈
  • 태그
  • 방명록
250x250
hELLO · Designed By 정상우.
Marais.lee

Welcome to Marais's IT Home

에라토스테네스의 체 | 프로그래머스 소수찾기 | 파이썬
Study/코테

에라토스테네스의 체 | 프로그래머스 소수찾기 | 파이썬

2024. 2. 14. 16:39
728x90

프로그래머스 > 코딩테스트 > 알고리즘 고득점 Kit > 완전탐색 > 소수찾기 문제를 해결하기 위해 구글링을 하다가 '에라토스테네스의 체'를 알게 되었다.

'에라토스테네스의 체'는 수학에서 소수를 찾는 빠르고 쉬운 방법이다. 고대 그리스 수학자 에라토스테네스가 발견했다고 한다.

 

알고리즘은 아래와 같다. 

[참고] https://ko.wikipedia.org/wiki/%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98_%EC%B2%B4

 

 

이렇게 풀어 설명한 것을 보면 되게 쉽게 느껴지는 알고리즘이다. 하지만 이렇게 간단하게 생각하기까지가 참 어려운 것 같다...

 

 

아래는 python(3.6.4)으로 구현한 코드이다. 

def prime_list(n):
    # 에라토스테네스의 체 초기화: n개 요소에 True 설정(소수로 간주)
    sieve = [True] * n

    # n의 최대 약수가 sqrt(n) 이하이므로 i=sqrt(n)까지 검사
    m = int(n ** 0.5)
    for i in range(2, m + 1):
        if sieve[i] == True:           # i가 소수인 경우
            for j in range(i+i, n, i): # i이후 i의 배수들을 False 판정
                sieve[j] = False

    # 소수 목록 산출
    return [i for i in range(2, n) if sieve[i] == True]

 

sqrt(n), 즉 m 까지로만 나눠봐도 해당 숫자가 소수인지 알 수 있다.

 

여기서 시간복잡도는 O(sqrt(n)) 으로 줄어들게 된다.

 

** 1은 자연수 중에서 유일하게 소수도 아니고, 합성수도 아닌 수다. 

소수란? 양의 약수가 1과 자신뿐인, 1보다 큰 자연수, 즉 소수는 약수를 2개만 갖는다..

 

 

(수학이 지금에서야 발목을 잡을 줄이야... 쿠ㅜㅜ)


이 개념을 활용한 프로그래머스의 소수찾기 풀이 (구글링)

[문제링크]

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

필요한 개념

- 순열? 

  서로 다른 n개의 원소를 가지는 어떤 집합에서 중복 없이 순서에 상관있게 r개의 원소를 선택하거나 혹은 나열하는 것

  ex) ["1", "7"] -> ("1"), ("7"), ("1","7"), ("7", "1")

 

- 조합?

  서로 다른 n개의 원소를 가지는 어떤 집합에서 중복 없이 순서에 상관없이 r개의 원소를 선택하거나 혹은 나열하는 것

  ex) ["1", "7"] -> ("1"), ("7"), ("1","7")

 

아래는 풀이 코드이다. 

from itertools import permutations

def solution(numbers):
    answer = []
    # 문자열 numbers를 각각 떼어내기
    nums = [n for n in numbers]
    per = []
    # 각 숫자 조합해서 순열로 만들기 ()
    # len(numbers)가 3개라면 1,2,3개를 순서상관있게 뽑는 각각의 경우의수, 순열을 구한다. 
    for i in range(1, len(numbers) + 1):
            per += list(permutations(nums, i))
    # 각각을 int형으로 변환
    new_nums = [int(("").join(x)) for x in per]
        
    for i in new_nums:
        if i < 2:
            continue
        check = True 
        for j in range(2, int(i ** 0.5) + 1):
            if i % j == 0:
                check = False
                break
        if check:
            # answer += i : Error ; 'int' object is not iterable
            answer.append(i)
            
    return len(set(answer))

 

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'Study > 코테' 카테고리의 다른 글

5탄 [프로그래머스 입문 문제] 코테에 필요한 파이썬 기초 문법 정리  (0) 2024.02.22
코딩테스트 파이썬 | 백준 SW마에스트로 모음집, 프로그래머스 고득점 kit 문제 답 모음집  (0) 2024.02.17
4탄 [프로그래머스 입문 문제] 코테에 필요한 파이썬 기초 문법 정리  (1) 2024.01.25
3탄 [프로그래머스 입문 문제] 코테에 필요한 파이썬 기초 문법 정리  (0) 2024.01.20
    'Study/코테' 카테고리의 다른 글
    • 5탄 [프로그래머스 입문 문제] 코테에 필요한 파이썬 기초 문법 정리
    • 코딩테스트 파이썬 | 백준 SW마에스트로 모음집, 프로그래머스 고득점 kit 문제 답 모음집
    • 4탄 [프로그래머스 입문 문제] 코테에 필요한 파이썬 기초 문법 정리
    • 3탄 [프로그래머스 입문 문제] 코테에 필요한 파이썬 기초 문법 정리
    Marais.lee
    Marais.lee
    구글링으로 한국어로 된 글을 찾지 못했거나 이해하는데 어려움이 있었던 이슈를 공유합니다.

    티스토리툴바