소수찾기

배지원·2022년 11월 3일
0

알고리즘

목록 보기
10/16

프로그래머스
https://school.programmers.co.kr/learn/courses/30/lessons/12921

1. 문제

소수 찾기

  • 프로그래머스 문제를 풀기전에 소수인지 아닌지 판별하기위한 단계과정
  • 입력받은 숫자 n이 소수인지 판별하기

소수란?

  • 1보다 큰 자연수 중 1과 자기 자신만을 약수로 가지는 수
  • 1은 소수가 아니다.

2. 문제분석

  1. n의 값을 입력받는다.
  2. 1~n 사이의 소수를 구하기 위해 여러가지 식을 대입하여 숫자를 나눈다.
  3. 소수인지 아닌지 판별한다.

🚫 제한조건 1. n은 2이상 1000000이하의 자연수입니다.

3. 설계

(1) N-1까지 대입하여 나누는 방법

  • 2부터 주어진 숫자 N-1까지 대입하여, 나머지가 0이 되는 숫자가 있는지 확인한다.
  • 나머지가 0이 나왔다면 떨어져 나누어지는 숫자가 있으므로 소수가 아니다.
<public boolean firstMethod(int number) {
    for (int i = 2; i < number; i++) {
        if (number % i == 0) {
            return false;
        }
    }
    return true;
}

(2) N/2 까지대입하여 나누는 방법

  • 자기 자신을 제외하고 절반을 초과하는 숫자에서 나눴을 때 나머지가 0이 나오면 소수가 아니다. 예) n이 8일때 2~3까지 나누었을때 2일때 나머지값이 0이므로 소수가 아님
public boolean secondMethod(int number) {
    for (int i = 2; i < number / 2; i++) {
        if (number % i == 0) {
            return false;
        }
    }
    return true;
}

(3) Template Callback

  • DI 의존성 주입에서 사용하는 특별한 전략 패턴
  • 전략패턴에 익명 내부 클래스를 더하여 사용하는 방식

4. CODE

익명 함수

interface Strategy{
    boolean compare(int a);
}

public class AnonymousClassInPrimeNumber {
    boolean isPrime(int num, Strategy stmt) {
        for (int i = 2; stmt.compare(i, num); i++) {
            System.out.println(i);
            if(num % i == 0) return false;
        }
        return true;
    }

    public static void main(String[] args) {
        AnonymousClassInPrimeNumber acip = new AnonymousClassInPrimeNumber();
        boolean r = acip.isPrime(17, new Strategy() {		// n-1까지 대입하는 경우
            @Override
            public boolean compare(int i, int num) {
                return i<num;
            }
        });
        System.out.println(r);
        
        boolean r2 = acip.isPrime(17,new Strategy() {		// n/2의 값까지 대입하는 경우
            @Override
            public boolean compare(int i,int num) {
                return i<num/2;
            }
        });
        System.out.println(r2);
    }
}
  • inteface를 오버라이딩을 통해 자신이 사용하고 싶은 식으로 바꿔서 사용 가능

람다식 활용

interface StatementStrategy{
    boolean compare(int a, int b);
}

public class TemplateCallbackPrime {

    boolean isPrime(int num, StatementStrategy stmt) {
        for (int i = 2; stmt.compare(i, num); i++) {
            if (num % i == 0) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        TemplateCallbackPrime tcp = new TemplateCallbackPrime();
        System.out.println(tcp.isPrime(17,(i,num) -> i<num));
        System.out.println(tcp.isPrime(17,(i,num) -> i<num/2));
    }
}
profile
Web Developer

0개의 댓글