728x90
반응형
내 풀이(시간 초과)
import java.beans.beancontext.BeanContext;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
//소수 구하기(1929)
public class Q_1929 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int m = Integer.parseInt(st.nextToken());
int n = Integer.parseInt(st.nextToken());
for(int i=m; i<n+1; i++) {
int cnt = 0;
if(i == 1) {
continue;
} else {
for(int j=1; j<i+1; j++) {
if(i%j == 0) { //i를 j로 나눈 나머지가 0일 때
cnt++; //cnt++ (i의 약수의 개수를 의미)
}
}
if(cnt == 2) { //i의 약수의 개수가 2개일 때 i는 소수
bw.write(i + "\n");
}
}
}
bw.flush();
bw.close();
}
}
이렇게 풀면 답은 잘 출력되지만 시간 초과가 떠서 실패!
에라토스테네스의 체를 이용해서 풀어야만 시간 초과가 안 뜨고 해결이 가능하다.
정답 풀이 (에라토스테네스의 체)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
//소수 구하기(1929)
public class Q_1929 {
public static void main(String[] args) throws Exception {
//에라토스테네스의 체 알고리즘 이용
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int m = Integer.parseInt(st.nextToken());
int n = Integer.parseInt(st.nextToken());
boolean[] check = new boolean[n+1]; //소수인지 아닌지 판별용 배열 선언 (0~n까지)
check[0] = check[1] = true; //소수 아닐 때 true, 소수일 때 false
for(int i=2; i<=n; i++) { //2~n까지 반복
if(check[i] == true) { //true이면 소수가 아님. continue;
continue;
}
for(int j=i+i; j<=n; j=j+i) { //각 소수의 배수에 true를 대입.
check[j] = true;
}
}
for(int i=m; i<=n; i++) { //m~n까지
if(check[i] == false) { //check[i]가 소수일 때
bw.write(i + "\n"); //bw.write에 i 출력
}
}
bw.flush(); //bw에 있는 데이터 flush.
bw.close();
}
}
문제
M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다.
(1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
3 16
출력
한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.
3
5
7
11
13
결과
이 문제는 풀지 못했다. 시간 초과 때문에 구글링을 하였고 에라토스테네스의 체 라는 것을 알게 되었다. 처음엔 잘 이해를 하지 못해서 넘어갔다가 주말에 시간 좀 남을 때 공부해서 이해한 후 다시 한 번 풀어봤다.
반응형
'개발 > 코테 준비' 카테고리의 다른 글
[JS] 프로그래머스 - 위장 (0) | 2022.02.13 |
---|---|
[java] 프로그래머스 - 문자열 내 마음대로 정렬하기 (0) | 2021.12.10 |
자바 백준 1193 - 분수찾기 (설명 포함) (0) | 2021.10.26 |
자바 백준 2775 - 부녀회장이 될테야 (0) | 2021.10.21 |
자바 백준 2839 - 설탕 배달 (0) | 2021.10.21 |
댓글