안녕하세요.
오늘은 프로그래머스의 코딩테스트 lv.0단계 중에 약구 구하기를 공부해보겠습니다.
언어는 Java로 구현하였습니다.
문제 설명
정수 n이 매개변수로 주어질 때, n의 약수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.
제한 사항
입출력 예
문제 풀이
약수를 구하기 위해 반복문을 사용해 매개변수를 1부터 n까지 나누며, 나머지가 0인 수를 배열에 담아 반환하였습니다.
약수의 개수를 미리 알 수 없기 때문에 우선 매개변수와 같은 크기의 임시 배열을 만들고 약수를 찾을 때마다 count를 증가시켰습니다.
이후 count 크기의 최종 배열을 생성하고 임시 배열에 담긴 약수들을 복사하여 최종 배열로 반환하도록 구현했습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
class Solution {
public int[] solution(int n) {
int[] temp = new int[n];
int count = 0;
for (int i = 1; i <= n; i++) {
if (n % i == 0) {
temp[count] = i;
count++;
}
}
int[] answer = new int[count];
for (int i = 0; i < count; i++) {
answer[i] = temp[i];
}
return answer;
}
}
|
추가 풀이
다른 분들의 풀이 중에 1부터 √n까지만 반복하며 약수를 구하는 방법이 있어서 공부해보았습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import java.util.*;
class Solution {
public int[] solution(int n) {
List<Integer> list = new ArrayList<>();
for (int i = 1; i * i <= n; i++) {
if (n % i == 0) {
list.add(i);
if (i != n / i) {
list.add(n / i);
}
}
}
return list.stream().sorted().mapToInt(Integer::intValue).toArray();
}
}
|
이 방식은 1부터 n까지 전부 나누지 않고 1부터 √n까지만 반복하여 약수를 찾습니다.
약수는 항상 짝을 이루기 때문에 i가 약수라면 n / i 도 함께 약수가 됩니다.
예를 들어, 24의 약수는 [1-24], [2-12], [3-8], [4-6]처럼 쌍으로 구성됩니다.
따라서 반복문을 √n까지만 돌리면서 i가 약수일 경우 n / i 도 함께 추가하여 결과값을 얻게 되면 시간 효율성을 높일 수 있습니다.
이렇게 구한 약수들은 정렬되어 있지 않고 중복될 수 있으므로 stream() 함수를 사용해 정렬한 뒤 배열로 변환하여 최종 결과를 반환합니다.
사용 함수
마무리 정리
이번 문제는 약수를 구하는 방식에서 1부터 √n까지 반복하는 방법을 적용하여 시간 효율성을 높일 수 있다는 점을 배웠습니다.
앞으로 문제를 풀 때 시간 효율성도 고려하여 접근하도록 노력하겠습니다.
이상으로 프로그래머스 lv.0 - 약수 구하기 문제를 마치겠습니다.
감사합니다.
[프로그래머스] Lv.0 - 숫자 찾기 (2) | 2025.05.15 |
---|---|
[프로그래머스] Lv.0 - 문자열 정렬하기(2) (1) | 2025.05.14 |
[프로그래머스] Lv.0 - 분수의 덧셈 (0) | 2025.04.04 |
[프로그래머스] Lv.0 - 인덱스 바꾸기 (0) | 2023.03.09 |
[프로그래머스] Lv.2 - 올바른 괄호 (0) | 2023.03.03 |
댓글 영역