Coding Test/Java Coding Test

[프로그래머스 / 자바] - 무작위로 k개의 수 뽑기

nam_ji 2024. 8. 8. 15:37

무작위로 k개의 수 뽑기

문제

  • 정수 배열 arr과 정수 k가 매개변수로 주어집니다.
  • 램덤으로 서로 다른 k개의 수를 저장한 배열을 만드려고 합니다.
  • 일정한 범위 내에서 무작위로 수를 뽑은 후,
  • 지금까지 나온적이 없는 수이면 배열 맨 뒤에 추가하는 방식입니다.
  • 어떤 수가 무작위로 주어질지 알고 있다고 가정하고,
  • 실제 만들어질 길이 k의 배열을 예상해봅니다.
  • 무작위 수는 arr에 저장된 순서대로 주어질 예정이라고 했을 때,
  • 완성된 배열을 출력하는 문제입니다.
  • 단, 완성될 배열의 길이가 k보다 작으면 나머지 값을 전부 -1로 채워서 출력합니다.
  • 입출력 예
    • arr k result
      [0, 1, 1, 2, 2, 3] 3 [0, 1, 2]
      [0, 1, 1, 1, 1] 4 [0, 1, -1, -1]


테스트 (인텔리제이)

  • for문으로 arr의 원소와 앞으로 채워질 answer의 원소를 비교하기 위해 for문을 사용했습니다.
  • for문은 arr의 크기만큼 순회하도록 하고 if문으로 answer의 크기와 k의 크기를 비교하여 같아지면 for문을 탈출할 수 있도록 break를 사용했습니다.
  • 또 다른 if문으로 answer의 원소와 arr의 원소를 비교하기 위해 contains를 사용했고 중복이 있으면 안되기 때문에 !를 사용하여 같은 원소가 없다면 arr의 원소를 answer에 담아주도록 했습니다.
  • 마지막으로 answer의 크기가 k와 같지 않은 상황에 for문이 끝난다면 answer의 나머지 공간을 -1로 채워야 한다는 조건이 있기 때문에 while을 사용하여 answer의 크기가 k보다 커지기 전까지 루프를 계속 돌 수 있도록 설정하고 한 루프당 answer에 -1을 추가할 수 있도록 했습니다.
package com.namji.codingtest;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class 무작위로_K개의_수_뽑기 {
  public static void main(String[] args) {
    /*
    정수 배열 arr과 정수 k가 매개변수로 주어집니다.
    램덤으로 서로 다른 k개의 수를 저장한 배열을 만드려고 합니다.
    일정한 범위 내에서 무작위로 수를 뽑은 후,
    지금까지 나온적이 없는 수이면 배열 맨 뒤에 추가하는 방식입니다.
    어떤 수가 무작위로 주어질지 알고 있다고 가정하고,
    실제 만들어질 길이 k의 배열을 예상해봅니다.
    무작위 수는 arr에 저장된 순서대로 주어질 예정이라고 했을 때,
    완성된 배열을 출력하는 문제입니다.
    단, 완성될 배열의 길이가 k보다 작으면 나머지 값을 전부 -1로 채워서 출력합니다.

    입출력 예
    arr	                k	result
    [0, 1, 1, 2, 2, 3]	3	[0, 1, 2]
    [0, 1, 1, 1, 1]	    4	[0, 1, -1, -1]

    입출력 설명
    #1
    앞에서부터 서로 다른 k개의 수를 골라내면 [0, 1, 2]가 됩니다.
    따라서 [0, 1, 2]를 return 합니다.
    #2
    서로 다른 수의 개수가 2개 뿐이므로 서로 다른 수들을
    앞에서부터 차례대로 저장한 [0, 1]에서 이후
    2개의 인덱스를 -1로 채워넣은 [0, 1, -1, -1]을 return 합니다.
     */
    int[] arr = {0, 1, 1, 2, 2, 3};
    int k = 3;
    List<Integer> answer = new ArrayList<>();

    for (int i = 0; i < arr.length; i++) {
      if (answer.size() == k) {
        break;
      }
      if (!answer.contains(arr[i])) {
        answer.add(arr[i]);
      }
    }
    while (answer.size() < k) {
      answer.add(-1);
    }

    System.out.println(answer);
  }
}

프로그래머스 코드

import java.util.*;

class Solution {
    public List solution(int[] arr, int k) {
        List<Integer> answer = new ArrayList<>();
        
        for (int i = 0; i < arr.length; i++) {
            if (answer.size() == k) {
                break;
            }
            if (!answer.contains(arr[i])) {
                answer.add(arr[i]);
            }
        }
        while (answer.size() < k) {
            answer.add(-1);
        }
        
        return answer;
    }
}