본문 바로가기
Study (etc)/Problem Solving

[BOJ / C++] 2581번 : 소수

by Haren 2022. 9. 25.

문제

자연수 M과 N이 주어질 때 M이상 N이하의 자연수 중 소수인 것을 모두 골라 이들 소수의 합과 최솟값을 찾는 프로그램을 작성하시오.

예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 소수는 61, 67, 71, 73, 79, 83, 89, 97 총 8개가 있으므로, 이들 소수의 합은 620이고, 최솟값은 61이 된다.

입력

입력의 첫째 줄에 M이, 둘째 줄에 N이 주어진다.

M과 N은 10,000이하의 자연수이며, M은 N보다 작거나 같다.

출력

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

단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.

Solved.ac 레벨

실버 V

풀이

#include <bits/stdc++.h>

using namespace std;

int m, n;
int minVal = -1;
int sum;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    cin >> m >> n;

    for(int i = m; i <= n; i++){
        int j;

        if(i == 0 || i == 1) continue;

        for(j = 2; j <= i; j++){
            if(i % j == 0) break;
        }

        if(i == j){
            if(minVal == -1) minVal = i;
            sum += i;
        }
    } 

    if(minVal != -1){
        cout << sum << '\n' << minVal << '\n';
    } else cout << minVal << '\n';

    return 0;
    

}

 

 

2581번: 소수

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

www.acmicpc.net

 

이번에 문제를 풀어나가는 방법을 카테고리별 풀이가 아닌, 난이도에서 랜덤한 문제를 골라 카테고리를 파악하고 속도감있게 알고리즘을 적용하여 푸는 방식으로 변화시켜보고 있는데, 그 첫 문제다... 생각 외로 실전에 약할듯?