역시나 전 문제도 문제풀이를 볼 수밖에 없었던 너무나도 어려운 문제였다ㅠㅠ
그래도 이번 문제는 직접 풀어 기분 좋아 글을 써본다.
물론 효율적인 방법은 아닌 것 같다.
다른 분이 써놓은 코드랑 비교하니 내가 너무 비효율적이었던 것이다.
우선은 기록이니 글을 쓰고,
답과 한번 더 비교해보며 공부해봐야겠다.
1978
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Test1978 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int cnt = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int sosu = 0;
for(int i = 0; i < cnt; i++) {
int value = Integer.parseInt(st.nextToken());
if(!((value / 2 > 1 && value % 2 == 0)
|| (value / 3 > 1 && value % 3 == 0)
|| (value / 5 > 1 && value % 5 == 0)
|| (value / 7 > 1 && value % 7 == 0)
|| (value / 11 > 1 && value % 11 == 0)
|| (value / 13 > 1 && value % 13 == 0)
|| (value / 17 > 1 && value % 17 == 0)
|| (value / 19 > 1 && value % 19 == 0)
|| (value / 21 > 1 && value % 21 == 0)
|| (value / 23 > 1 && value % 23 == 0)
|| (value / 27 > 1 && value % 27 == 0)
|| (value / 29 > 1 && value % 29 == 0)
|| value == 1))
sosu++;
}
System.out.print(sosu);
}
}
주어지는 수의 최대 수는 1000개이다.
소수중에 제곱했을때, 최대 값이 1000을 넘기지 않는 범위 내에서 소수의 개수를 얻을 수 있었다.
다음 문제에서 좀 더 코드를 간결하게 줄여 보았다.
2581
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
public class Test2581 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int min = Integer.parseInt(br.readLine());
int max = Integer.parseInt(br.readLine());
ArrayList<Integer> arr = new ArrayList<>();
for (int i = min; i <= max; i++) {
if (isSosu(i))
arr.add(i);
}
if (arr.size() == 0) {
System.out.println(-1);
} else {
System.out.println(arr.stream().mapToInt(Integer::intValue).sum());
System.out.println(Collections.min(arr));
}
}
//이 값이 소수인지 아닌지 체크
private static boolean isSosu(int value) {
if (value == 1) return false;
//제곱을 했을때, 자연수 만을 넘기기 전까지의 소수들
int[] arr = new int[]{
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47,
49, 53, 59, 61, 67, 71, 73, 77, 79, 83, 89, 91, 97
};
for (int j : arr) {
if (!(value / j <= 1 || value % j != 0)) {
//나눠지는게 하나라도 나오면 소수가 아님
return false;
}
}
//나눠지는게 하나도 안나온다면 소수
return true;
}
}
이번에도 10000을 넘기지 않는 제곱의 수를 배열에 넣어주고,
그 안에 해당하지 않는 값에 따라 소수인지 아닌지 판별하게 했다.
오늘 술약속이 있어서.. 여기까지 하고 이만..