본문 바로가기
Study with me/프로그래머스 L0 마스터하기

프로그래머스 - L0 소인수분해

by 외계나무 2024. 4. 12.

프로그래머스 - level 0 소인수분해

소수 한 20개 나열한 배열로 해봤는데 테스트 케이스 5~6개 정도가 실패 뜨길래 그냥 루프 돌림.

import java.util.*;

class Solution {
    public int[] solution(int n) {
        List<Integer> answer = new ArrayList<>();
        
        int i = 2;
        while(true) {
            if(n%i==0) {
                if(!answer.contains(i)) {
                    answer.add(i);
                }
                n/=i;
            } else {
                i++;
            }
            
            if(i>9997) break;
        }
        
        return answer.stream().mapToInt(Integer::intValue).toArray();
    }
}

9997은 n이 가질 수 있는 최대값인 10000보다 작은 소수 중 가장 큰 수라서...

 

근데 자료구조를 잘 사용한 타인의 풀이를 발견해서 가져와 봤다.

import java.util.LinkedHashSet;

class Solution {
    public int[] solution(int n) {
        LinkedHashSet<Integer> primeNumbers = new LinkedHashSet<>();

        int i = 2;
        while (n != 0 && i <= n) {
            if (n % i == 0) {
                primeNumbers.add(i);
                n /= i;
            } else {
                i++;
            }
        }

        return primeNumbers.stream().mapToInt(Integer::intValue).toArray();
    }
}

중복 값 처리를 안하나 했는데, LinkedHashSet이더라고...

자바의 큰 특징이자 장점 중 하나는 다양한 자료구조를 인터페이스와 그를 구현한 클래스로 제공한다는 것임.

그걸 잘 사용하는 게 자바를 잘 사용하는 거겠지... 난 멀었다... ㅎ....

 

LinkedHashSet의 특징

  1. 순서가 유지됨: 요소를 삽입한 순서대로 저장되며, 반복하여 접근할 때도 이 순서(인덱스)가 유지된다. = Linked
  2. 중복 요소 제거: 중복된 요소를 한 번만 저장한다. = Set ( Hash )
  3. 빠른 검색과 삽입/삭제: 해시 테이블과 연결 리스트를 통해 빠른 검색 및 삽입/삭제 작업을 지원한다. = Hash, Linked

기본적으로는 Set 인터페이스를 상속하는데, 해시 테이블을 사용해 값을 저장하고 이 요소들의 순서를 연결 리스트를 통해 유지하는 자료구조라서 세 성격을 모두 가지고 있다. ( LinkedList 방식의 버킷을 사용하는 HashSet인 것)