본문 바로가기

[프로그래머스 Lv.0] 약수구하기

@doyiya242026. 1. 6. 10:04

약수구하기

 

문제 설명

정수 n이 매개변수로 주어질 때, n의 약수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ n ≤ 10,000

입출력 예 설명

입출력 예 #1

  • 24의 약수를 오름차순으로 담은 배열 [1, 2, 3, 4, 6, 8, 12, 24]를 return합니다.

입출력 예 #2

  • 29의 약수를 오름차순으로 담은 배열 [1, 29]를 return합니다.

 

내가 작성한 코드  

import java.util.*;

class Solution {
    public int[] solution(int n) {
        //set을 이용해서 중복값을 없애고 1부터 쭉하면... 최악인디 졸려서 머리가 안도라간다 오앙오앙 ㅠㅠㅠ
        HashSet<Integer> hashset = new HashSet<>();
        
        for(int i = 1; i * i <= n; i++){
            if( n%i == 0 ) {
                hashset.add(i);
                hashset.add(n/i);
            }
        }
        
        
        int[] answer = hashset.stream()
                              .sorted()
                              .mapToInt(Integer::intValue)
                              .toArray();
        
        return answer;
    }
}

->  중복값을 위해 set을 이용해야하겠다고 시작한 구현. 참고 블로그와 gpt의 도움을 받아 구현하게되었다. stream은 아직도 이해 못함 ㅠㅠ

 

서칭 검색어

*set 중복 제거

*약수 구하는 법

 

 

GPT 최종 도움

🧠 왜 i * i <= n 이냐?

  • 약수는 항상 으로 존재
    예: 36 → (1,36), (2,18), (3,12), (4,9), (6,6)
  • √n 이후는 이미 앞에서 처리됨
  • i == n/i 인 경우도 Set 이 알아서 처리

 

🧠 Stream

1. Stream = 데이터를 한 줄로 흘려보내면서 처리하는 파이프

2. Stream 안의 값을 오름차순 정렬

3.

  • 현재 타입: Stream<Integer>
  • 우리가 원하는 결과: int[]
  • Stream<Integer> → int[] 직접 불가

👉 중간에 IntStream으로 변환

4. IntStream → int[]

 

HashSet<Integer>
   ↓ stream()
Stream<Integer>
   ↓ sorted()
Stream<Integer> (정렬)
   ↓ mapToInt()
IntStream
   ↓ toArray()
int[]

 

다른 사람이 작성한 코드

import java.util.stream.IntStream;
import java.util.Arrays;

class Solution {
    public int[] solution(int n) {
        return IntStream.rangeClosed(1, n).filter(i -> n % i == 0).toArray();
    }
}
import java.util.List;
import java.util.ArrayList;

class Solution {
    public int[] solution(int n) {
        List<Integer> answer = new ArrayList<>();
        for(int i=1; i<=n; i++){
            if(n % i == 0){
                answer.add(i);
            }
        }
        return answer.stream().mapToInt(x -> x).toArray();
    }
}

 

-> 똑똑한 사람이 많다..  set이 아닌 arraylist를 사용한 코드와 stream만 이용한 코드를 퍼왔다 

 

 

 

 

회고

stream을 전혀 모른다 다음 코테 구현을 공부해서 사용예정. set을 사용해야겟다고 생각했지만 사용법을 모른다. 공부필요

 

 

참고 블로그

https://lold2424.tistory.com/50

 

[Java] 배열에 중복된 값 제거하는법 (Set)

배열에서 중복값을 제거하는 방법은 크게 2가지(Set, Stream)가 있다. 1. Set Java에서 Set은 중복을 허용하지 않는 컬렉션 인터페이스다. Set은 순서가 없는 요소들의 집합으로, 원소들이 추가된 순서나

lold2424.tistory.com

https://www.google.com/search?q=%EC%95%BD%EC%88%98+%EA%B5%AC%ED%95%98%EB%8A%94+%EB%B2%95&rlz=1C5MACD_enKR1118KR1119&oq=%EC%95%BD%EC%88%98+%EA%B5%AC%ED%95%98%EB%8A%94+%EB%B2%95&gs_lcrp=EgZjaHJvbWUyCQgAEEUYORiABDIGCAEQABgeMgYIAhAAGB4yCAgDEAAYCBgeMggIBBAAGAgYHjIICAUQABgFGB4yCAgGEAAYBRgeMgoIBxAAGAUYChgeMggICBAAGAUYHjIICAkQABgFGB7SAQgyNDMxajBqN6gCALACAA&sourceid=chrome&ie=UTF-8

 

🔎 약수 구하는 법: Google 검색

 

www.google.com

 

목차