이 영역을 누르면 첫 페이지로 이동
쿄코코 블로그의 첫 페이지로 이동

쿄코코

페이지 맨 위로 올라가기

쿄코코

얼레벌레 생활🤯

99클럽 코테 스터디 23일차 TIL - 완전탐색(프로그래머스- 소수찾기)

  • 2024.11.20 00:39
  • Python/😈 99클럽 코테 스터디 4기 TIL
    반응형

    https://school.programmers.co.kr/learn/courses/30/lessons/42839

     

    프로그래머스

    SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

    programmers.co.kr

    • 오늘의 학습 키워드 : 완전탐색
    • 공부한 내용
      • 여러 개의 소수를 구해야 한다면? 에라토스테네스의 체를 사용.
      • 단일 숫자의 소수 여부를 판별한다면? 간단한 나눗셈 방식을 사용
        (숫자 n에 대해 2부터 √n까지 나눠보고, 나누어떨어지지 않으면 소수.)

    즉, 이문제는 숫자 조합의 범위가 그렇게 크지 않으므로 간단한 나눗셈 방식으로 사용해도 괜찮다..

    1️⃣ 간단한 나눗셈 방식 사용한 경우

    def is_prime(n):
        """소수 판별 함수: n이 소수인지 확인"""
        if n < 2:
            return False
        for i in range(2, int(n**0.5) + 1):
            if n % i == 0:
                return False
        return True
    
    def solution(numbers):
        """numbers로 만들 수 있는 소수의 개수를 반환"""
        # 중복 방지를 위해 set 사용
        unique_numbers = set()
    
        # 모든 조합 생성 (재귀 방식)
        def generate_numbers(current, remaining):
            if current:  # 숫자가 생성되었을 경우만 추가
                unique_numbers.add(int(current))
            for i in range(len(remaining)):
                generate_numbers(current + remaining[i], remaining[:i] + remaining[i+1:])
    
        # 재귀 호출로 모든 조합 생성
        generate_numbers("", list(numbers))
    
        # 소수의 개수 계산
        return sum(1 for num in unique_numbers if is_prime(num))

    2️⃣ 에라토스테네스의 체 사용

    에라토스테네스의 체
    작은 숫자부터 시작해, 그 숫자의 배수를 모두 지웁니다.
    지워지지 않고 남은 숫자들은 모두 소수
    시간 복잡도: O(n log log n)


    예제 (n=10에서 소수를 찾기)

    1. 초기 배열: [2, 3, 4, 5, 6, 7, 8, 9, 10]
    2. 2의 배수 제거: [2, 3, _, 5, _, 7, _, 9, _]
    3. 3의 배수 제거: [2, 3, _, 5, _, 7, _, _, _]
    4. 결과 소수: [2, 3, 5, 7]
    def solution(numbers):
        # 1. 입력 숫자를 리스트로 변환하고, 최대값 계산
        digit = list(numbers)  # 입력 문자열을 리스트로 변환
        max_number = int("".join(sorted(digit, reverse=True)))  # 가능한 가장 큰 숫자 계산
    
        # 2. 에라토스테네스의 체로 소수 판별 배열 생성
        is_prime = [True] * (max_number + 1)  # 소수 여부 저장 (True: 소수)
        is_prime[0] = is_prime[1] = False  # 0과 1은 소수가 아님
        for i in range(2, int(max_number**0.5) + 1):
            if is_prime[i]:  # i가 소수라면
                for j in range(i * i, max_number + 1, i):  # i의 배수는 소수가 아님
                    is_prime[j] = False
    
        # 3. 모든 가능한 숫자 조합 생성
        unique_numbers = set()  # 중복 제거를 위한 set
    
        # 재귀적으로 숫자 조합 생성
        def generate_number(current, remaining):
            if current:  # current에 값이 있을 때만 추가
                unique_numbers.add(int(current))  # 생성된 숫자를 set에 추가
            for i in range(len(remaining)):  # remaining에서 숫자 하나 선택
                generate_number(current + remaining[i], remaining[:i] + remaining[i + 1:])
    
        generate_number("", digit)  # 조합 생성 시작
    
        # 4. 소수 개수 세기
        answer = 0
        for num in unique_numbers:
            if is_prime[num]:  # 조합된 숫자가 소수인지 확인
                answer += 1
    
        return answer  # 소수의 개수 반환

     

    • 오늘의 공부 회고
      • 오랜만에 에라토스테네스의 체 사용해서 가물가물한 느낌쓰~
      • KEEP GOING~!

    반응형

    'Python > 😈 99클럽 코테 스터디 4기 TIL' 카테고리의 다른 글

    99클럽 코테 스터디 26일차 TIL - DP(백준-전력망을 둘로 나누기)  (0) 2024.11.22
    99클럽 코테 스터디 24일차 TIL - 완전탐색(프로그래머스-전력망을 둘로 나누기)  (0) 2024.11.20
    99클럽 코테 스터디 22일차 TIL - 완점탐색,백트래킹 (프로그래머스- 피로도)  (1) 2024.11.18
    99클럽 코테 스터디 21일차 TIL - 완점탐색 (프로그래머스- 카펫)  (0) 2024.11.18
    99클럽 코테 스터디 20일차 TIL - 완점탐색 (프로그래머스- 모의고사)  (1) 2024.11.16

    댓글

    이 글 공유하기

    • 구독하기

      구독하기

    • 카카오톡

      카카오톡

    • 라인

      라인

    • 트위터

      트위터

    • Facebook

      Facebook

    • 카카오스토리

      카카오스토리

    • 밴드

      밴드

    • 네이버 블로그

      네이버 블로그

    • Pocket

      Pocket

    • Evernote

      Evernote

    다른 글

    • 99클럽 코테 스터디 26일차 TIL - DP(백준-전력망을 둘로 나누기)

      99클럽 코테 스터디 26일차 TIL - DP(백준-전력망을 둘로 나누기)

      2024.11.22
    • 99클럽 코테 스터디 24일차 TIL - 완전탐색(프로그래머스-전력망을 둘로 나누기)

      99클럽 코테 스터디 24일차 TIL - 완전탐색(프로그래머스-전력망을 둘로 나누기)

      2024.11.20
    • 99클럽 코테 스터디 22일차 TIL - 완점탐색,백트래킹 (프로그래머스- 피로도)

      99클럽 코테 스터디 22일차 TIL - 완점탐색,백트래킹 (프로그래머스- 피로도)

      2024.11.18
    • 99클럽 코테 스터디 21일차 TIL - 완점탐색 (프로그래머스- 카펫)

      99클럽 코테 스터디 21일차 TIL - 완점탐색 (프로그래머스- 카펫)

      2024.11.18
    다른 글 더 둘러보기

    정보

    쿄코코 블로그의 첫 페이지로 이동

    쿄코코

    • 쿄코코의 첫 페이지로 이동

    검색

    메뉴

    • 홈

    카테고리

    • 분류 전체보기 (168)
      • Python (24)
        • 😈 99클럽 코테 스터디 4기 TIL (23)
        • 궁금한거 정리 (1)
      • SQL (16)
        • HackerRank (15)
      • [백준] Python,Java로 풀기📖 (71)
        • 정렬(Sorting) (6)
        • 그리디 (5)
        • 문자열 (7)
        • 수학 (3)
        • DFS&BFS (10)
        • 구현 (4)
        • 다이나믹 (17)
        • 이분탐색 (1)
        • 자료구조 (10)
        • 최단거리 (5)
        • 인덱스트리 (0)
      • [프로그래머스]Python,Java로 풀기 (6)
        • Level 1 (4)
        • Level 2 (2)
      • Study Platform📚 (25)
        • (운영체제) - 블로그 및 강의 참고 (0)
        • 김영한👨🏻‍🏫의 스프링 부트와 JPA 실무 완전 .. (5)
        • (알고리즘)- [이코테] 이것이 코딩테스트다 정리 (10)
        • 그림으로 배우는 Http&Network Basic (10)
      • 까먹을까봐 적는 것들 (4)
      • 테스트 보고 난 후..🤔 (0)
      • kt 에이블스쿨 (18)

    최근 글

    인기 글

    댓글

    공지사항

    아카이브

    태그

    • 항해99
    • 오블완
    • 티스토리챌린지
    • 백준
    • 99클럽
    • 프로그래머스
    • 코딩테스트준비
    • TiL

    나의 외부 링크

    정보

    쿄코코의 쿄코코

    쿄코코

    쿄코코

    블로그 구독하기

    • 구독하기
    • RSS 피드

    방문자

    • 전체 방문자
    • 오늘
    • 어제

    티스토리

    • 티스토리 홈
    • 이 블로그 관리하기
    • 글쓰기
    Powered by Tistory / Kakao. © 쿄코코. Designed by Fraccino.

    티스토리툴바