코딩/백준 문제 (브론즈)

[백준/2581/C언어] 소수 _ 풀이

룻밤 2023. 8. 28. 22:59

https://www.acmicpc.net/problem/2581

 

2581번: 소수

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

www.acmicpc.net


풀이

#include <stdio.h>
#include <stdlib.h>

int main() {
	int m, n;
	int total = 0;
	scanf("%d", &m);
	scanf("%d", &n);
	int* arr = (int*)malloc((n - m + 1) * sizeof(int));
	int c = 0; 
	for (int i = m; i <= n; i++) {		// i = m 
		// i가 2가 아닐때만 진행
        if (i != 2) {					
        	// i가 2면 두번째 for문 실행 불가
			for (int j = 2; j < i; j++) {	
				if (i % j == 0) {		// 약수가 있다면
					break;				// i+1
				}
                // 약수가 없고 j가 i-1일때(소수일때)
				else if (i % j > 0 && j == i - 1) {	
					// arr에 차례대로 소수 저장
                    arr[c] = i;			
					c++;				// c+1
				}
			}
		}
		else if (i==2){		// i가 2라면 소수다
			arr[c] = i;
			c++;
		}
		
	}
	if (c == 0) printf("-1\n");		// c가 0일때(소수가없을때)
	else {							// 소수일때
		for (int i = 0; i < c; i++) {	// 소수의 합
			total += arr[i];
		}
		printf("%d\n", total);			//소수 합 출력
		printf("%d\n", arr[0]);			// 최소값 출력
	}
	free(arr);
	return 0;
}

i가 2인 조건만 없다면 코드가 더 깨끗했을것 같다.

다음부터는 i%j==0인 조건을 이용해서 1과 i 자기자신까지 포함하여 i의 모든 약수가 2개 이상일때 소수가 아니다

라는 식으로 풀어봐야겠다.