[알고리즘문제풀기] 소인수분해

silver's avatar
Jan 16, 2025
[알고리즘문제풀기] 소인수분해

문제

내가 작성한 정답

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

silver