함수를 이용한 소수 판별(코드트리)

먼치즈·2025년 7월 1일
0

구조화 연습

1. 페이퍼 플랜으로 빠른 정리

항목예시
입력 예시A=5, B=19
출력 목표A이상 B이하 소수들의 합을 출력
반복 흐름A부터 B까지 순회하면서 소수 판별을 통해 true인것을 result에 더해나간다.
조건 분해(1)A<=arr<=B(2)소수인것만 더하기
구현 계획소수판별함수(2부터 n-1까지 나눴을때 안나눠지면 true),메인함수에서 더하기

구현계획 변경:

  • 소수판별함수는 (2부터 √n까지만 검사하면 됨)(O(√n)),위의 방법으로 하면 전체 순회로O(n)의 시간복잡도

2. 구조화 템플릿으로 사고 정리

[입출력 구조]

  • 입력: 정수 A, B
  • 출력: A이상 B이하 소수들의 합을 출력

[핵심 조건]
소수를 판별해서 A이상 B이하 소수들의 합을 구해야함.

[반복 구조]

  • for i in A ~ B : isPrimeNum(i) true->result+=i

[예외 및 세부 조건]
1로는 다나눠지기 때문에 2부터 나눌것이다.

[예시 흐름]
A가 8 B가 98
i= 9->소수아님 x
i= 11->소수임 result에 더함
~i가 √98일때까지 반복

  • 예외 및 세부 조건 설정이 어렵다고 느꼈다.


구조화 수정

1. 입출력 구조

  • 입력: 정수 A, B (A ≤ B)
  • 출력: A 이상 B 이하의 소수들의 합

2. 핵심 조건

  • 소수란 1과 자기 자신만 약수로 가지는 수
  • A~B 범위 안의 소수만 누적합해야 함

3. 반복 구조

for (int i = A; i <= B; i++) {
    if (isPrime(i)) result += i;
}

4. 예외 및 세부 조건

조건이유
n < 2 이면 소수 아님소수의 정의상 2부터 시작
2는 소수나눌 필요 없이 true 처리
2보다 큰 짝수는 소수 아님2 외 모든 짝수는 2로 나눠짐
소수 판별은 i <= √n 까지만 검사약수 쌍 중 작은 쪽이 √n 이하이므로
나눗셈은 n % i == 0 이면 false 반환약수 존재 시 소수 아님

5. 예시 흐름 시뮬레이션

  • A = 8, B = 98
i = 8 → 소수 아님 (2로 나눠짐) → 스킵  
i = 9 → 소수 아님 (3으로 나눠짐) → 스킵  
i = 11 → 소수 (2,3에서 나눠지지 않음) → result += 11  
...  
i = 97 → 소수 → result += 97  
i = 98 → 소수 아님 → 종료

6. 시간복잡도 분석

  • 소수 판별 1회당: O(√n)
  • A ~ B까지 반복: (B - A + 1)번

→ 전체 시간복잡도: O((B - A + 1) × √B)

7. 최종 구현 계획 요약

  • isPrime 함수는 √n까지 나눠보는 로직으로 구현 → O(√n)
  • 메인 루프는 A~B까지 반복하며 소수만 누적 → O((B - A + 1) × √B)
  • 예외 처리: n < 2 false 처리, 나머지는 √n까지 반복하여 약수 여부 판단

최종 구현

import java.util.Scanner;

public class Main {

    public static boolean isPrimeNum(int num){
        if(num<2){
            return false;
        }
        if(num==2){
            return true;
        }
        if(num%2==0){
            return false;
        }
        for(int i=3;i<=Math.sqrt(num);i+=2){
            if(num%i==0){
                return false;
            }
        }
        return true;

    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        int result=0;
        for(int i=a;i<=b;i++){
            if(isPrimeNum(i)){
                result+=i;
            }
        }
        System.out.print(result);
    }
}
profile
먼치즈의 개발 벨로그입니다:)

0개의 댓글