소인수분해 Lv. 0

박영준·2023년 5월 11일
0

코딩테스트

목록 보기
79/300

문제 설명

소인수분해란 어떤 수를 소수들의 곱으로 표현하는 것입니다. 예를 들어 12를 소인수 분해하면 2 2 3 으로 나타낼 수 있습니다. 따라서 12의 소인수는 2와 3입니다. 자연수 n이 매개변수로 주어질 때 n의 소인수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.

class Solution {
    public int[] solution(int n) {
        int[] answer = {};
        return answer;
    }
}

제한 사항

  • 2 ≤ n ≤ 10,000

입출력 예

입출력 예 설명

  • 입출력 예 #1
  • 12를 소인수분해하면 2 2 3 입니다. 따라서 [2, 3]을 return합니다.

-입출력 예 #2

  • 17은 소수입니다. 따라서 [17]을 return 해야 합니다.

  • 입출력 예 #3

  • 420을 소인수분해하면 2 2 3 5 7 입니다. 따라서 [2, 3, 5, 7]을 return합니다.


해결법

방법 1

import java.util.*;

class Solution {
    public int[] solution(int n) {
    
    	int[] answer = {};
        List<Integer> list = new ArrayList<>();		// 가변적인 배열
        int i = 2;
        
        while (n >= 2) {
        	if (n % i == 0) {
            	list.add(i);		// 소인수를 list 배열에 추가
                n /= i;
            } else {		// 소인수가 아니라면 +1을 계속 더해가며 소인수가 될 때까지 반복
            	i++;
            }   
        }
        
        answer = list.stream().distinct().mapToInt(Integer::intValue).toArray();
        
        return answer;
    }
}       

list.stream().distinct().mapToInt(Integer::intValue).toArray();

  • stream().distinct() : 중복된 값을 제거
  • mapToInt(Integer::intValue) : Interger 타입 -> int 타입 변환
  • toArray() : 배열로 변환

방법 2

import java.util.HashSet;

class Solution {
    public int[] solution(int n) {
    
        HashSet<Integer> set = new HashSet<>();
        
        for (int i = 2; i <= n; i++) {
            while (n % i == 0) {		// 모든 n 이 i 로 나눴을 때 나머지가 0일 때까지 반복
                set.add(i);
                n /= i;
            }
        }
        if (n != 1) set.add(n);

        return set.stream().mapToInt(Integer::intValue).sorted().toArray();
    }
}

방법 3

import java.util.LinkedHashSet;

class Solution {
    public int[] solution(int n) {
    
        LinkedHashSet<Integer> set = new LinkedHashSet<>();
        
        for (int i = 2; i <= Math.sqrt(n); i++) {
            while (n % i == 0) {
                set.add(i);
                n /= i;
            }
        }
        if (n != 1) set.add(n);

        return set.stream().mapToInt(Integer::intValue).toArray();
    }
}

소인수분해

profile
개발자로 거듭나기!

0개의 댓글