풀이 1.
import java.util.ArrayList;
class Solution {
public int[] solution(int n) {
ArrayList<Integer> answerList = new ArrayList<>();
for (int i = 1; i <= Math.sqrt(n); i++) {
if (n % i == 0) {
answerList.add(i);
if (n / i != i) answerList.add(n / i);
}
}
return answerList.stream()
.mapToInt(i -> i)
.sorted()
.toArray();
}
}
풀이 2.
import java.util.stream.IntStream;
class Solution {
public int[] solution(int n) {
return IntStream.rangeClosed(1, n).filter(i -> (n % i == 0)).toArray();
}
}
풀이 1은 제곱근의 값 까지만 반복하기, 약수의 반대수 추가
(예를 들어, 100의 경우 1-100, 2-50 처럼 앞의 약수를 알면 반대의 큰 약수를 구할 수 있다)
로 최대한 반복횟수를 줄이며 모든 약수를 찾을 수 있게 구현하였다.
그리고 정렬을 통해 순서대로 출력할 수 있게 하였고
풀이 2는 단순하게 스트림을 이용하여 filter를 통해 약수의 조건에 해당하면 배열에 추가하도록하였다.
어느 방식이 효율적인지, 조금 더 나은 성능을 보여주는지는 잘 모르겠다.
그런점이 알고리즘 문제의 매력이자 헷갈리는 점이 아닐까 싶다.