

내 풀이 1 : long 사용 - 틀렸습니다.
import java.util.*;
public class Main {
public static void main(String[] args) {
// 주어진 N보다 크거나 같은 소수를 하나씩 출력한다.
// 소수 빨리 구하기 : 루트 씌우기
// 루트 씌워서 가장 비슷한 숫자로 나눠서 안나눠지면 소수이다.
// 입력받은 소수를 Math.squrt()로 나눠본다.
// 안나눠지면 소수니까 그대로 출력한다.
// 나눠지면 소수가 아니므로 입력받은 수를 증가시킨다.
// 그대로 다시 나눠본다.
// 안나눠질 때 그 수는 소수이므로 그 수를 출력한다.
Scanner sc = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
long num = sc.nextLong();
List<Long> list = new ArrayList<>();
double sqrt = 0;
for (int i = 0; i < num; i++) {
list.add(sc.nextLong());
long j = 0;
for (j = list.get(i); ; j++) {
// j가 소수라면 이 for문을 빠져나간다.
boolean sosu = true;
for (int k = 2; k <= Math.sqrt(j); k++) {
if (j % k == 0) {
sosu = false;
break;
}
}
if (sosu) {
break;
}
}
sb.append(j);
sb.append("\n");
}
System.out.println(sb.toString());
}
}
내 풀이 2 : 0, 1 반례 적용 - 정답
import java.util.*;
public class Main {
public static void main(String[] args) {
// 주어진 N보다 크거나 같은 소수를 하나씩 출력한다.
// 소수 빨리 구하기 : 루트 씌우기
// 루트 씌워서 가장 비슷한 숫자로 나눠서 안나눠지면 소수이다.
// 입력받은 소수를 Math.squrt()부터 무한대로 나뉘는지 판별한다.
// 입력받은 수가 0이나 1일 경우엔 모두 답이 2이므로 그 경우를 제외하고 시작한다.
// 미리 boolaen값을 입력받아 소수라면 true, 아니라면 false값을 준다.
// for문 안에 여러 조건문과 반복문을 썼으므로,
// 소수이면 무조건 빠져나갈 조건문을 하나 만든다.
// 소수들을 모두 출력한다.
Scanner sc = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
long num = sc.nextLong();
List<Long> list = new ArrayList<>();
double sqrt = 0;
for (int i = 0; i < num; i++) {
list.add(sc.nextLong());
long j = 0;
if (list.get(i) != 0 && list.get(i) != 1) {
for (j = list.get(i); ; j++) {
// j가 소수라면 이 for문을 빠져나간다.
boolean sosu = true;
for (int k = 2; k <= Math.sqrt(j); k++) {
if (j % k == 0) {
sosu = false;
break;
}
}
if (sosu) {
break;
}
}
}else if(list.get(i) == 0) {
j = 2;
}else{
j = 2;
}
sb.append(j);
sb.append("\n");
}
System.out.println(sb.toString());
}
}
느낀점
알고리즘 문제에 수학 공식을 이용해서 푸는 것은 진짜 괴롭다..
입력받은 수가 소수이거나 아닐 경우에는 입력받은 수를 증가시켜야 했으므로
이렇게 코드를 구현했는데, 처음 풀이가 틀려서 질문게시판을 찾아보고 반례를 적용했다.
0과 1을 입력받을 경우에는 모두 소수가 2가 나오므로 그 경우를 적용해서 정답을 맞혔다.