문제 설명
소인수분해란 어떤 수를 소수들의 곱으로 표현하는 것입니다. 예를 들어 12를 소인수 분해하면 2*2*3으로 나타낼 수 있습니다. 따라서 12의 소인수는 2와 3입니다. 자연수 n이 매개변수로 주어질 때 n의 소인수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.
제한 사항
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. 주어진 수 n까지 반복문을 돌면서 while을 통해 소인수를 HashSet에 저장함.
HashSet
Set 인터페이스에서 지원하는 구현 클래스.
순서대로 입력되지 않고, 일정하게 유지됨.
중복을 허용하지 않는다는 특징이 있음.
(import java.util.*; 추가하기)
Set<자료형> 이름 = new HashSet<>();
Stream
람다를 활용할 수 있는 기술 중 하나.
배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합하여 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있음
-> 즉 배열과 컬렉션을 함수형으로 처리
map : 스트림 내 요소들을 하나씩 특정 값으로 변환해줌. 이 때 값을 변환하기 위한 람다를 인자로 받음.
mapToInt : 스트림을 IntStream으로 변환해주는 메서드
sorted : 스트림의 중간 연산자. 오름차순 정렬
toArray : 스트림을 배열로 변환
코드
import java.util.*;
class Solution {
public int[] solution(int n) {
int[] answer = {};
Set<Integer> set = new HashSet<>();
for(int i = 2; i <= n; i++) {
while( n % i == 0) { // i로 안나누어 지면 while문을 타지 않고 for문을 통해 i가 증가됨.
set.add(i); // i로 나눠지면 i가 소인수이기 때문에 HashSet에 추가함.
n /= i; //또 i로 나눠보고 i로 나눈 값이 i랑 나눴을 때 나머지가 생기면 while을 벗어나서 또 for문으로 올라감.
}
}
answer = set.stream().mapToInt(i ->i).sorted().toArray();
return answer;
}
}
[참고 사이트]
https://velog.io/@superscman/%EC%86%8C%EC%9D%B8%EC%88%98%EB%B6%84%ED%95%B4-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EC%9E%90%EB%B0%94?utm_source=oneoneone
https://crazykim2.tistory.com/474
https://futurecreator.github.io/2018/08/26/java-8-streams/
https://dev-kani.tistory.com/32
https://tjdtls690.github.io/studycontents/java/2022-08-10-stream_sorted/
https://developer-talk.tistory.com/765
'IT > 프로그래머스' 카테고리의 다른 글
프로그래머스 삼각형의 완성조건 (1) - Java (0) | 2023.06.02 |
---|---|
프로그래머스 중복된 문자 제거 - Java (0) | 2023.06.01 |
프로그래머스 배열 원소의 길이 - Java (0) | 2023.05.28 |
프로그래머스 컨트롤제트 - Java (2) | 2023.05.28 |
프로그래머스 문자열 정렬하기(1) - Java (0) | 2023.05.18 |