본문 바로가기
공부/백준

[백준] 2581번

by _음주토끼_ 2022. 6. 16.
 

2581번: 소수

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

www.acmicpc.net

 

1978번처럼 소수를 찾아내서 요리하는 소수 시리즈다. 다만 1978에서 추가된 조건이 존재한다.

우선 1978번 문제의 내용을 조금 언급해볼까 한다.

한 줄에 띄어쓰기로 각각 나타난 N개의 숫자 중 소수를 찾고 그 개수를 세어 출력한다.

입력값으로는 첫째 줄에 숫자의 개수 N, 둘째 줄에 N개의 숫자들이 들어온다.

출력값으로는 그 중 소수의 개수를 출력하면 된다.

알고리즘에서 소수를 찾아내려면 소수의 정의를 알면 간단하다.

소수는 자기 자신과 1로만 나누어 떨어지는 숫자이다.

따라서 2 이상의 다른 숫자로 나누어진다면 그건 소수가 아니다.

이걸 반복문에 넣어주면 된다.

N번만큼 소수가 아니라면 error를 1, 소수라면 개수를 카운트해주는 것을 반복한다.

그리고 마지막으로 count값을 출력하면 된다.

 

이 코드를 응용하여 2581번을 풀면 간단하다.

2581번은 주어진 범위 내에서 소수인 숫자들을 찾아 합과 최솟값을 출력하는 문제다.

그 구간 내에 소수가 존재하지 않을 경우 -1만을 출력한다.

소수 중 최솟값을 찾기 위해 배열 num을, 소수의 합을 구하기 위해 변수 sum을 선언한다.

1978번과 동일하게 반복문을 돌린다. 다만 여기서 변경되어야 할 점이 있다.

소수로 판정된 경우 배열 num에 append하고, 그 소수의 값만큼 sum에 더해준다.

소수를 모두 찾은 후 반복문을 빠져나와 배열 num을 오름차순으로 정렬한다.

그럼 num[0]에 가장 작은 소수가 있으니 그것을 출력해주면 된다.

이건 어제 푼 2562번에서 다룬 내용과도 유사하다.

소수가 없는 경우 -1을 출력해야하므로 조건문을 작성한다.

소수가 없는 경우는 sum이 0인 경우이므로 그것을 조건으로 쓴다.

sum == 0 이면 -1, 그렇지않으면 sum과 num[0]을 차례로 출력한다.

이 코드로는 4620ms로 시간이 꽤 오래 걸렸다.

움...더 빠르게 알고리즘을 수행할 수 있는 방법은 아직 생각해보지 못함.

'공부 > 백준' 카테고리의 다른 글

[백준] 18258번  (0) 2022.10.22
[백준] 2525번  (0) 2022.06.16
[백준] 11866번  (0) 2022.06.16
[백준] 2805번  (0) 2022.06.16
[백준] 14681번  (0) 2022.06.16