본문 바로가기
문제풀이/프로그래머스

Lv0. 순서쌍의 개수 - java

by Ropung 2023. 10. 9.

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을 사용하는게 유리하다고 생각이 들었다.
하지만, 댓글에 실험의 조건이 아쉽다는 평이 있어서 직접 실험해보는게 좋을것 같다고 생각이 들었다

추후 따로 포스팅 해보기로 하며 마치도록 하겠다.


참고 - https://creampuffy.tistory.com/147

'문제풀이 > 프로그래머스' 카테고리의 다른 글

Java - 배열의 유사도  (2) 2023.10.12
Java - 모음제거  (2) 2023.10.12
Lv0. 삼각형의 완성조건 (1) - java  (0) 2023.10.09
Lv0.편지-java  (2) 2023.10.07