[백준] 21919번: 소수 최소 공배수

ByWindow·2021년 10월 26일
0

Algorithm

목록 보기
65/104
post-thumbnail

📝문제

입력받는 수 하나하나당 소수인 것을 체크하는 것이 아니라
가장 큰 수를 길이로 갖는 배열을 만들어서 에라토스테네스의 채로 소수인지 체크한 후,
해당 수가 소수이면 곱해주는 연산을 해준다.

문제를 풀면서 미처 생각하지 못해서 틀렸던 부분은 중복되는 수가 있을 수 있다는 점이다.
문제에서도 중복되는 수가 없다는 조건이 없으므로 중북체크를 해줘야한다.
나는 그 수를 곱해준 뒤, 해당 수가 소수가 아닌 것으로 바꾸어주어 다음 연산에서 해당 수는 건너뛰도록 했다.

📌코드

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);
    }
}
profile
step by step...my devlog

0개의 댓글