본문 바로가기

Java/코딩테스트

[프로그래머스/181858] 무작위로 K개의 수 뽑기 (LinkedHashSet, Arrays.fill, Math.min(unique.length, k))

✏️ 문제 설명

랜덤으로 서로 다른 k개의 수를 저장한 배열을 만드려고 합니다. 적절한 방법이 떠오르지 않기 때문에 일정한 범위 내에서 무작위로 수를 뽑은 후, 지금까지 나온적이 없는 수이면 배열 맨 뒤에 추가하는 방식으로 만들기로 합니다.
이미 어떤 수가 무작위로 주어질지 알고 있다고 가정하고, 실제 만들어질 길이 k의 배열을 예상해봅시다.
정수 배열 arr가 주어집니다. 문제에서의 무작위의 수는 arr에 저장된 순서대로 주어질 예정이라고 했을 때, 완성될 배열을 return 하는 solution 함수를 완성해 주세요.
단, 완성될 배열의 길이가 k보다 작으면 나머지 값을 전부 -1로 채워서 return 합니다.


✏️ code

📌Integer[] unique
- Arrays.stream(arr): arr 배열을 스트림으로 변환
- .boxed(): 기본형 int → 래퍼 클래스 Integer로 변환
- .collect(Collectors.toCollection(LinkedHashSet::new)): 스트림 요소를 LinkedHashSet으로 수집해 중복 제거
- toArray(new Integer[0]): LinkedHashSet을 배열로 변환

📌Arrays.fill(answer, -1): answer 배열의 모든 요소를 -1로 채움

📌for문
- Math.min(unique.length, k): unique 배열 길이와 k 중 작은 값을 반복문 최대값으로 설정
- answer[i] = unique[i]: unique 요소를 순서대로 answer에 복사
  • boxed()가 필요한 이유
    : Collectors.toCollection() 메서드는 객체형 데이터를 다루기 때문에, 기본형 int를 객체형 Integer로 변환해야 합니다.
  • Collectors.toCollection
    : 스트림의 요소를 특정 컬렉션으로 수집하기 위해 사용됩니다. 본 코드에서는 새로운 LinkedHashSet 인스턴스를 만들었습니다.
  • LinkedHashSet::new
    : Set은 원래 중복 제거 + 순서 없음 → LinkedHashSet을 사용하여 중복제거 + 입력된 순서를 유지합니다.
  • toArray
    : 컬렉션의 데이터를 배열로 변환합니다.
  • new Integer[0]
    : 초기 크기가 0인 배열을 생성합니다. (다만, 크기가 부족하면 toArray가 내부적으로 더 큰 배열을 만듭니다.)
import java.util.Arrays;
import java.util.stream.Collectors;
import java.util.LinkedHashSet;
import java.lang.Math;

class Solution {
    public int[] solution(int[] arr, int k) {
        Integer[] unique = Arrays.stream(arr).boxed()
                                 .collect(Collectors.toCollection(LinkedHashSet::new))
                                 .toArray(new Integer[0]);
        
        int[] answer = new int[k];
        Arrays.fill(answer, -1);
        
        for (int i = 0; i < Math.min(unique.length, k); i++) {
            answer[i] = unique[i];
        }
        return answer;
    }
}
반응형