본문 바로가기

코딩/백준 BOJ

[백준/C언어] 2581번 - 소수

백준 웹사이트 "2581번 - 소수" 문제풀이입니다.

언어는 C언어입니다. (제출 언어: C99)

 


문제

 

2581번: 소수

M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다.  단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.

www.acmicpc.net


소스 코드

#include <stdio.h>

int main(void){
    int M, N;
    scanf("%d\n%d", &M, &N);

    int sum=0, min=0;
    for(int i=M; i<=N; i++){
        // i가 소수인지 확인
        for(int j=2; j<i; j++){ // 2는 고려하지 못함
            if(i%j==0){
                break;
            }
            if(j==i-1){
                //i는 소수
                sum+=i;
                if(min==0)
                    min = i;
            }
        }
        if(i==2){
            sum+=i;
            min=i; // 2는 가장 작은 소수
        }
    }
    if(min!=0)
        printf("%d\n%d", sum, min);
    else
        printf("-1");
}

문제 풀이

  이전 문제인 1978번 문제와 비슷한 문제입니다. 이번에는 정해진 범위 내의 수들 중에, 소수들을 모두 찾아 그 합을 구하고, 소수들 중 최솟값을 구하는 문제입니다. M과 N을 입력 받으면, M부터 시작하여 각각의 수가 소수인지 아닌지 판별을 해야합니다. '소수 판별'을 위한 코드 Line 8 ~ 25는 1978번과 같은 코드를 (변수만 바꿔서) 사용하였습니다. 이 부분에 대한 설명은 1978번 풀이를 참고해주세요!

  아래는 백준 웹사이트 "1978번 - 소수 찾기" 문제풀이 링크입니다.

 

[백준/C언어] 1978번 - 소수 찾기

백준 웹사이트 "1978번 - 소수 찾기" 문제풀이입니다. 언어는 C언어입니다. (제출 언어: C99) 문제 1978번: 소수 찾기 첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지

loding.tistory.com

  M 부터 시작하여 숫자를 하나씩 검사할 때, 처음으로 만나게 되는 소수가 최솟값이 될 것입니다. 이때 변수 'min'은 처음 선언한 0으로 있을 것이기에, min이 0일 경우에만 min을 업데이트 시켜줍니다 (Line 18). 그 후 다른 소수들을 만날 때 min은 0이 아닐 것이기 때문에, min은 더 이상 업데이트 되지 않고 계속 최솟값을 가지게 됩니다. i가 2일 때도 예외적으로 sum과 min을 처리해주는 것도 까먹지 마세요!

반응형