21919 소수 최소 공배수

DONGJIN IM·2022년 6월 30일
0

코딩 테스트

목록 보기
134/137

문제 이해

수열 A가 주어진다.

이 중 소수들의 최소공배수를 구하는 문제이다.


문제 풀이

소수의 최소 공배수란 말이 사실 이상한 말이긴 하다.
소수들의 최소 공배수는 곧 소수들의 곱과 마찬가지이다.

즉, 이 문제는 소수를 구하고, 구한 소수값들을 곱한 것이 답이다.

단 여기서 중요한 것은 수열에 값이 중복되어 나올 수 있으므로 이 부분을 처리해줘야하는 것이다.
(ex. 2 2라면 소수는 2이므로 2*2가 아닌 2가 답이 되어야 함)

참고로, 수학과에서 배운 내용이지만 N의 약수 중 소수를 구하기 위해선 2 ~ N까지 모두 검사하지 않고 2 ~ N\sqrt{N}까지만 확인하면 된다.
따라서, for문을 (int) N\sqrt{N}까지만 수행시켜 약수로 나눠지는지 아닌지를 확인하면 된다.


코드

import java.io.*;
import java.util.*;

public class Main {
	static StringBuilder sb = new StringBuilder();
	static FastReader sc = new FastReader();
	
	static boolean check(int prime) {
		// 소수인지 판별 여부
        // 2 ~ sqrt(prime)까지만 검사하면 된다.
		int right = (int) Math.sqrt(prime);
		
		for(int i =2;i<=right;i++) {
			if(prime % i==0) return false;
		}
		
		return true;
	}
	
	public static void main(String[] args) {
		int N = sc.nextInt();
		
		long ans = 1;
		boolean[] arr = new boolean[1000001];
		
		for(int i =0;i<N;i++) {
			int prime = sc.nextInt();
			
			if(!arr[prime]&&check(prime)) {
            // arr[prime] = true라면 이미 검사한 숫자이므로 제외
				arr[prime] = true;
				ans*=prime;
			}
		}
		if(ans==1) ans = -1;
		System.out.println(ans);
	}
	
	static class FastReader // 빠른 입력을 위한 클래스
}

결과

  • 틀렸습니다 : 수열에 값이 중복될 수 있기 때문에 이 부분을 처리해 줬어야 했는데, 처리해주지 않아 틀렸다.
profile
개념부터 확실히!

0개의 댓글

관련 채용 정보