Algorithm

[Programmers] 소수 찾기 - java

2022. 7. 23. 14:41
목차
  1. 소수 찾기 (완전 탐색)

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

 

프로그래머스

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

programmers.co.kr

소수 찾기 (완전 탐색)

배운 것

에라토스테네스의 체

소수 찾기

재귀를 통한 숫자 조합

에라토스테네스의 체 란?

수학에서 에라토스테네스의 체는 소수를 찾는 방법을 말한다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 에라토스테네스의 체를 이용해 1~n까지의 소수를 알고 싶다면, n까지 모든 수의 배수를 다 나눠 볼 필요는 없다. 만약 n보다 작은 어떤 수 m이  m=ab라면 a와b 중 적어도 하나는 Math.sqrt(n) 이하(루트 n)이다. 즉, n보다 작은 합성수 m은 Math.sqrt(n) 보다 작은 수의 배수만 체크해도 된다. 

풀이에 대한 설명은 아래 소스코드 주석을 확인하면 된다.

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

// 소수 찾기
public class Problem8 {

    Set<Integer> numberSet = new HashSet<>();

    public static void main(String[] args) {
        Problem8 problem8 = new Problem8();
        problem8.solution("17");
    }

    public int solution(String numbers) {
        int count = 0;

        // 만들 수 있는 숫자 조합하기(재귀)
        recursive("", numbers);
        System.out.println(numberSet); // 출력해 보기

        // 만든 숫자가 소수인지판단한다 - 에라토스테네스의 체 (특정 숫자의 루트값까지만 확인해서 소수인지 판별)
        Iterator<Integer> it = numberSet.iterator();
        while (it.hasNext()) {
            int number = it.next();
            if (isPrime(number)) {
                count++;
            }
        }
        return count;
    }

    private boolean isPrime(int number) {
        // 1. 0과 1은 소수가 아니다.
        if (number == 0 || number == 1) {
            return false;
        }

        // 2. 에라토스테네스의 체의 limit을 계산한다.
        int limit = (int) Math.sqrt(number); // root를 씌운값

        // 3. 에라토스테네스의 체에 따라 limit까지만 배수 여부를 확인한다.
        for (int i = 2; i <= limit; i++) {
            if (number % i == 0) {
                return false;
            }
        }
        return true;
    }

    private void recursive(String comb, String others) {
        // 1. 현재 조합을 set에 추가한다.
        // set을 통한 만든 숫자 중복제거
        if (!comb.equals("")) {
            numberSet.add(Integer.valueOf(comb));
        }
        // 2. 남은 숫자 중 한개를 더 해 새로운 조합을 만든다.
        for (int i = 0; i < others.length(); i++) {
            recursive(comb + others.charAt(i), others.substring(0, i) + others.substring(i + 1));
        }
    }
}

Reference

  • https://www.youtube.com/watch?v=pF368QqdQb4 
  • 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
  • https://namu.wiki/w/%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98%20%EC%B2%B4

'Algorithm' 카테고리의 다른 글

[codility] TapeEquilibrium (java)  (0) 2022.08.05
[BOJ] 1010번 유기농 배추  (0) 2022.07.21
[BOJ] 백준 1697 숨바 꼭질  (0) 2022.07.20
[leet] Best Time to Buy and Sell Stock  (0) 2021.12.13
[leetcode] twosum (java)  (0) 2021.12.02
  1. 소수 찾기 (완전 탐색)
'Algorithm' 카테고리의 다른 글
  • [codility] TapeEquilibrium (java)
  • [BOJ] 1010번 유기농 배추
  • [BOJ] 백준 1697 숨바 꼭질
  • [leet] Best Time to Buy and Sell Stock
향찡
향찡
백엔드 개발자
향찡
Dev Story
향찡
전체
오늘
어제
  • 분류 전체보기 (97)
    • Java (42)
      • design pattern (7)
      • JavaCafe Study (4)
    • Kotlin (2)
    • Spring (4)
    • TypeScript (1)
    • DevOps (2)
      • AWS (1)
    • DB (4)
      • Real Mysql (2)
      • Redis (1)
    • OS (3)
      • Linux (3)
    • Algorithm (7)
    • Clean Code (1)
    • Git (5)
    • 환경 설정 (2)
    • 그냥 생각 (1)
    • 서평 (12)
      • 한빛미디어, 나는리뷰어다 2022 (4)
    • 세미나 (11)
    • 기타 (0)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • 한빛미디어
  • 자바스크립트
  • 파이썬
  • 스터디
  • 알고리즘
  • 코딩교육
  • 패스트캠퍼스
  • 유스콘
  • java
  • Real MySQL
  • 백준
  • 자바카페
  • LeetCode
  • fastcampus
  • 패스트캠퍼스후기
  • java #study
  • 제이펍
  • git #github #doit #형상관리
  • OKKY
  • 코딩자격증
  • 자바스터디
  • Kotlin
  • 백기선
  • 패캠
  • 스터디올래
  • 자바
  • 스터디할래
  • 인프런
  • 깃 #깃허브
  • 코딩테스트

최근 댓글

최근 글

hELLO · Designed By 정상우.
향찡
[Programmers] 소수 찾기 - java
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.