본문 바로가기

TIL/Algorithm

Java 백준 2581번 문제 - 소수

반응형

소수 성공 출처

시간제한 메모리 비율

1 초 128 MB 59430 22832 19655 39.152%

문제

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

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

입력

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

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

출력

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

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

예제 입력 1 

60

100

예제 출력 1 

620

61


BufferedReader로 입력값을 받는다

 

isPrime() 메서드는 소수인지 판별해주는 boolean타입 메서드인데,

매개변수로 받은 숫자가 만약 2보다 작다면 소수가 아니므로 return false;

반복문을 입력받은 숫자까지 도는 와중에

If조건문을 이용하여 만약 숫자가 a를 나눌 수 있다면 소수가 아니므로 return false;

위의 조건을 다 통과했다면 return true(소수)

 

작은 값 M, 큰 값 N을 변수로 선언하여 주고

TreeSet tm을 선언하였는데 소수의 최솟값을 편하게 구하기 위해서

정렬해서 담아주는 TreeSet을 사용하였다

 

M부터 N까지의 숫자 중 소수인 것만 tm에 담아주었고

합계를 누적시킬 변수 sum을 선언하여

for-each문으로 tm의 인자들을 하나씩 꺼내서 sum에 누적시켰다

 

만약에 소수가 없다면 -1을 리턴해야 하기 때문에

tm의 사이즈가 0이라면 즉, 소수가 없다면 -1을 리턴하고

그렇지 않다면

누적 값 sum과 첫 번째 값 (최소값 )first를 출력한다 

 

반응형