문제
https://school.programmers.co.kr/learn/courses/30/lessons/120852
풀이
import java.util.*;
class Solution {
public int[] solution(int n) {
// Set을 사용하여 중복된 소인수를 자동으로 제거하고, 순서를 보장하기 위해 LinkedHashSet 사용
Set<Integer> factors = new LinkedHashSet<>();
// 2로 나누기: 2는 가장 작은 소수이므로, 먼저 2로 계속 나누어 처리
while (n % 2 == 0) {
factors.add(2); // 2가 소인수로 발견되면 추가
n /= 2; // n을 2로 나누기
}
// 그 이후는 홀수만 나누기 (효율적이고 간단한 방법)
// 2로 나누었으므로 그다음 소수는 3부터 시작해 홀수만 검사합니다.
for (int i = 3; i <= Math.sqrt(n); i += 2) { // 3부터 시작해, i는 2씩 증가하며 홀수만 검사
// n이 i로 나누어지면, 그 소인수를 추가하고, n을 그 소인수로 나누기
while (n % i == 0) {
factors.add(i); // i가 소인수로 발견되면 추가
n /= i; // n을 i로 나누기
}
}
// 마지막으로, n이 2보다 크면 남은 n은 소수이므로 그것을 추가
// (예: n이 97이라면 97은 더 이상 나누어지지 않고 소수이므로 그 값을 추가해야 함)
if (n > 2) {
factors.add(n); // n이 소수라면 그것을 추가
}
// 결과를 List에서 int[] 배열로 변환하여 반환
return factors.stream()
.mapToInt(i -> i) // List<Integer>에서 int[]로 변환
.toArray(); // 배열로 반환
}
}
import java.util.LinkedHashSet;
class Solution {
public int[] solution(int n) {
// 소인수를 저장할 Set: 중복을 허용하지 않으며 순서를 유지합니다.
LinkedHashSet<Integer> primeFactors = new LinkedHashSet<>();
// 2부터 시작해서 n이 더 이상 나누어지지 않을 때까지 진행
int divisor = 2;
// n이 0이 아니고 divisor가 n보다 작거나 같을 때 반복
while (n != 1 && divisor <= n) {
// n이 divisor로 나누어지면 divisor를 소인수로 추가하고, n을 그로 나누기
if (n % divisor == 0) {
primeFactors.add(divisor); // 소인수로 divisor 추가
n /= divisor; // n을 divisor로 나누기
} else {
divisor++; // 나눠지지 않으면 divisor를 증가시킴 (다음 소수로 넘어가기)
}
}
// 결과를 int[] 배열로 변환하여 반환
return primeFactors.stream()
.mapToInt(Integer::intValue)
.toArray();
}
}
'Algorithm > Programmers' 카테고리의 다른 글
[Programmers] Lv.0 | 문자열 정렬하기 (1) | Java (0) | 2025.10.10 |
---|---|
[Programmers] Lv.0 | 숨어있는 숫자의 덧셈 (1) | Java (0) | 2025.10.09 |
[Programmers] Lv.0 | 컨트롤 제트 | Java (0) | 2025.10.07 |
[Programmers] Lv.0 | 배열 원소의 길이 | Java (0) | 2025.10.06 |
[Programmers] Lv.0 | 직사각형 넓이 구하기 | Java (0) | 2025.10.05 |
댓글