문제
내가 작성한 정답
1. 중복제거를 위한 Set사용 - with gpt
import java.util.*;
class Solution {
public int[] solution(int n) {
Set<Integer> factors = new LinkedHashSet<>();
// 2부터 n까지 나누면서 소인수 찾기
for (int i = 2; i <= n; i++) {
while (n % i == 0) { // i가 소인수라면
factors.add(i); // 중복 없이 저장
n /= i; // 나눈 후 계속 진행
}
}
// Set을 List로 변환 후 배열로 변환
return factors.stream().mapToInt(Integer::intValue).toArray();
}
}
Set
: 중복을 허용하지 않는 자료구조로, 순서가 중요하지 않은 데이터의 집합을 다룰 때 사용한다.
1. 중복된 요소를 자동으로 제거
2. 순서 보장 X (HashSet) vs. 순서 보장 O (LinkedHashSet)
3. 빠른 검색, 삽입, 삭제 성능 (O(1) ~ O(log n))
자료구조 | 특징 |
HashSet | 가장 빠름 (O(1)) ✅ - 순서 보장 X |
LinkedHashSet | 순서 유지 (입력 순서대로 저장) ✅ - 성능은 HashSet보다 약간 느림 |
TreeSet | 자동 정렬 (오름차순) ✅ - O(log n) (이진 트리) |
메서드
add(E e) - 요소 추가 (중복 시 무시)
remove(E e) - 특정 요소 삭제
contains(E e) - 특정 요소 존재 여부 확인 (true/false)
size() - 요소 개수 반환
isEmpty() - Set이 비어 있는지 확인
clear() - 모든 요소 삭제
iterator() - Set을 순회하는 반복자 반환
2. 중복을 제거하기 위해 while문 전에 i를 저장
import java.util.*;
class Solution {
public int[] solution(int n) {
List<Integer> list = new ArrayList<>();
for(int i = 2; i <= n; i++){
if(n%i==0){
list.add(i);
while (n%i==0){
n /= i;
}
}
}
if(n>1){
list.add(n);
}
return list.stream().mapToInt(i->i).toArray();
}
}
List → Array로 변환
// 1. 람다식 이용
list.stream().mapToInt(i->i).toArray();
// 2. intValue 메서드 참조
list.stream().mapToInt(Integer::intValue).toArray();
// 3. 깊은 복사
int[] array = new int[list.size()];
for(int i = 0; i < list.size(); i++){
array[i] = list.get(i);
}
// 4. Integer 배열로 변경
Integer[] array = new Integer[list.size()];
array = list.toArray(array);
// -> int 배열로 재변경 해줘야한다
int[] intArray = new int[array.length];
for (int i = 0; i < array.length; i++) {
intArray[i] = array[i]; // Integer를 int로 변환하여 저장
}
다른 사람들의 정답
import java.util.*;
class Solution {
public int[] solution(int n) {
List<Integer> primes = new ArrayList<>();
for (int i = 2; i <= n; ++i) {
if (isPrime(i) && n % i == 0) {
primes.add(i);
}
}
int[] answer = new int[primes.size()];
for (int i = 0; i < answer.length; ++i) {
answer[i] = primes.get(i);
}
return answer;
}
// 소수를 구하는 메서드
private boolean isPrime(int n) {
for (int i = 2; i <= n / 2; ++i) {
if (n % i == 0) {
return false;
}
}
return true;
}
}
Share article