입력받는 수 하나하나당 소수인 것을 체크하는 것이 아니라
가장 큰 수를 길이로 갖는 배열을 만들어서 에라토스테네스의 채로 소수인지 체크한 후,
해당 수가 소수이면 곱해주는 연산을 해준다.
문제를 풀면서 미처 생각하지 못해서 틀렸던 부분은 중복되는 수가 있을 수 있다는 점이다.
문제에서도 중복되는 수가 없다는 조건이 없으므로 중북체크를 해줘야한다.
나는 그 수를 곱해준 뒤, 해당 수가 소수가 아닌 것으로 바꾸어주어 다음 연산에서 해당 수는 건너뛰도록 했다.
package Baekjoon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ21919 {
public static void main(String[] args) throws IOException {
//에라토스테네스의 채로 소수인 것을 체크한다
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine()); //배열의 길이
int[] nums = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine());
int max = 0;
for(int i = 0; i < n; i++){
nums[i] = Integer.parseInt(st.nextToken());
max = Math.max(nums[i], max);
}
int[] isPrime = new int[max+1]; //0이면 prime
isPrime[1] = 1; //1은 소수가 아니다
long answer = 1;
for(int i = 2; i*i < isPrime.length; i++){
if(isPrime[i] == 1) continue;
for(int j = i*2; j < isPrime.length; j+=i){
isPrime[j] = 1;
}
}
for(int i = 0; i < nums.length; i++){
if(isPrime[nums[i]] == 1) continue;
answer *= nums[i];
isPrime[nums[i]] = 1; //같은 수 중복 제거
}
System.out.println(answer == 1 ? -1 : answer);
}
}