프로그래머스/Lv. 0(코딩 기초 트레이닝)

[프로그래머스 코딩테스트] 무작위로 K개의 수 뽑기(Java)

Sigfriede 2023. 5. 30. 01:00

  문제 설명

  랜덤으로 서로 다른 k개의 수를 저장한 배열을 만드려고 합니다. 적절한 방법이 떠오르지 않기 때문에 일정한 범위 내에서 무작위로 수를 뽑은 후, 지금까지 나온적이 없는 수이면 배열 맨 뒤에 추가하는 방식으로 만들기로 합니다.

  이미 어떤 수가 무작위로 주어질지 알고 있다고 가정하고, 실제 만들어질 길이 k의 배열을 예상해봅시다.

  정수 배열 arr가 주어집니다. 문제에서의 무작위의 수는 arr에 저장된 순서대로 주어질 예정이라고 했을 때, 완성될 배열을 return 하는 solution 함수를 완성해 주세요.

  단, 완성될 배열이 길이가 k보다 작으면 나머지 값을 전부 -1로 채워서 return 합니다.

 

  제한사항

  • 1 <= arr의 길이 <= 100,000
    • 0 <= arr의 원소 <= 100,000
  • 1 <= k <= 1,000

 

  입출력 예

arr k result
[0, 1, 1, 2, 2, 3] 3 [0, 1, 2]
[0, 1, 1, 1, 1] 4 [0, 1, -1, -1]
import java.util.*;
class Solution {
    public int[] solution(int[] arr, int k) {
        Set<Integer> set = new LinkedHashSet();
        for (int i: arr) {
            set.add(i);
        }
        int[] answer = new int[k];
        int index = 0;
        for (int i: set) {
            if (index >= k) {
                break;
            }
            answer[index++] = i;
        }
        while (index < k) {
            answer[index++] = -1;
        }
        return answer;
    }
}

  Set 인터페이스의 LinkedHashSet을 생성합니다. 문제에서는 중복을 허용하지 않으며, 원래 배열의 순서대로 새 배열에 삽입해야 합니다. 따라서 중복을 허용하지 않는 Set 인터페이스 중에서 순서를 보장하는 LinkedHashSet 클래스를 이용하는 것입니다.

  for-each문이 arr 배열을 순회하고 i는 이를 하나씩 받아, add 메소드를 이용하여 set에 추가합니다.

  answer 배열을 생성합니다. 문제에서 배열의 크기는 k로 제한하고 있으므로 k로 지정합니다. 그러나 배열의 크기와 삽입되는 원소의 길이 간 차이가 있을 수 있으므로 인덱스를 벗어나는 오류가 발생할 수 있습니다. 따라서 조건문과 반복문을 이용하여 둘을 맞추는 과정이 필요합니다.

  우선 for-each문에서 set을 순회하여 i가 하나씩 받습니다. 배열 answer의 index 번째 위치에 i를 할당합니다. if문에서 index가 k보다 크거나 같을 경우 break로 for문을 탈출합니다. 배열의 크기보다 원소가 많은 경우에 해당합니다.

  while문에서 index가 k보다 작을 경우 answer의 index 번째 원소에 -1을 할당합니다. 앞서 완성한 배열의 크기보다 원소가 적을 경우에 해당합니다.