Lv0.순서쌍의 개수 - java
[문제링크]
https://school.programmers.co.kr/learn/courses/30/lessons/120836
✔️요구사항
순서쌍이란 두 개의 숫자를 순서를 정하여 짝지어 나타낸 쌍으로 (a, b)로 표기합니다.
자연수 n
이 매개변수로 주어질 때 두 숫자의 곱이 n
인 자연수 순서쌍의 개수를 return하도록 solution 함수를 완성해주세요.
✔️제한사항
- 1 ≤ n ≤ 1,000,000
✔️입출력 예
n | result |
---|---|
20 | 6 |
100 | 9 |
입출력 예 #1
n
이 20 이므로 곱이 20인 순서쌍은 (1, 20), (2, 10), (4, 5), (5, 4), (10, 2), (20, 1) 이므로 6을 return합니다.
입출력 예 #2
n
이 100 이므로 곱이 100인 순서쌍은 (1, 100), (2, 50), (4, 25), (5, 20), (10, 10), (20, 5), (25, 4), (50, 2), (100, 1) 이므로 9를 return합니다.
✔️나의 문제풀이
class Solution {
public int solution(int n) {
int answer = 0;
for(int i=1; i<=n; i++){
if(n%i==0) answer++;
}
return answer;
}
}
- 처음 고민은 2중 포문을 돌려서 각 요소의 곱이
n
이면answer
을 증가시키는 방법을 생각했다. 하지만 시간복잡도가 O(n^2)이 되어 좋은 방법은 아닐거라 생각했다. i
가 n 만큼 1씩 증가하여 for문을 돌때n
으로 나눈값이 묷이 있으면answer
의 값을 1씩 증가시켜 문제를 해결하였다.
테스트 | 성능 |
---|---|
테스트 1 〉 | 통과 (0.03ms, 83.3MB) |
테스트 2 〉 | 통과 (0.04ms, 78.5MB) |
테스트 3 〉 | 통과 (2.12ms, 74.4MB) |
테스트 4 〉 | 통과 (0.02ms, 68.2MB) |
테스트 5 〉 | 통과 (2.07ms, 69.8MB) |
테스트 6 〉 | 통과 (8.80ms, 76.6MB) |
테스트 7 〉 | 통과 (0.03ms, 68.1MB) |
테스트 8 〉 | 통과 (0.03ms, 71.7MB) |
테스트 9 〉 | 통과 (6.09ms, 83.6MB) |
테스트 10 〉 | 통과 (7.78ms, 76.5MB) |
✔️다른사람의 문제풀이 1
import java.util.stream.IntStream;
class Solution {
public int solution(int n) {
return (int) IntStream.rangeClosed(1, n).filter(i -> n % i == 0).count();
}
}
- for 문을 사용하지 않고 IntStream으로
n
을 필터링하여 조건을주어 그 개수를count()
하여 해결하였다.
테스트 | 성능 |
---|---|
테스트 1 〉 | 통과 (1.24ms, 80.1MB) |
테스트 2 〉 | 통과 (1.30ms, 78.9MB) |
테스트 3 〉 | 통과 (3.67ms, 73.7MB) |
테스트 4 〉 | 통과 (2.39ms, 74.2MB) |
테스트 5 〉 | 통과 (4.09ms, 73.3MB) |
테스트 6 〉 | 통과 (12.15ms, 72.5MB) |
테스트 7 〉 | 통과 (0.88ms, 75.2MB) |
테스트 8 〉 | 통과 (1.10ms, 73.6MB) |
테스트 9 〉 | 통과 (16.39ms, 78.6MB) |
테스트 10 〉 | 통과 (11.37ms, 75MB) |
고민
✔️IntStream?
for-loop를 쓰지않고 IntStream을 쓰는것이 인상적이였고 알아보고 싶어졌다.
✔️언제 써야할까?
두 풀이 모두 결과(정답)은 같다. 그렇다면 어떤 차이가 있는것인지? 어떤 상황에서 쓰는게 더 좋은 방법일까? 하는 생각이 들어 둘의 차이점과 성능을 비교하는 글을 서치해보았다.
✔️for-loop vs IntStream 성능비교
어렵지않게 실험 블로그를 찾을수 있었다.
과정과 결론을 본 결과
반복 횟수가 적은 작업에 대해서는 for-loop
가 유리하고
반복 횟수가 많아질수록 stream
을 사용하는게 유리하다고 생각이 들었다.
하지만, 댓글에 실험의 조건이 아쉽다는 평이 있어서 직접 실험해보는게 좋을것 같다고 생각이 들었다
추후 따로 포스팅 해보기로 하며 마치도록 하겠다.
'문제풀이 > 프로그래머스' 카테고리의 다른 글
Java - 배열의 유사도 (2) | 2023.10.12 |
---|---|
Java - 모음제거 (2) | 2023.10.12 |
Lv0. 삼각형의 완성조건 (1) - java (0) | 2023.10.09 |
Lv0.편지-java (2) | 2023.10.07 |