Programmers

[프로그래머스][JS] 무작위로 K개의 수 뽑기

winter17 2023. 7. 1. 18:37

https://school.programmers.co.kr/learn/courses/30/lessons/181858

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 과정

function solution(arr, k) {
    const disSet = new Set(arr) // 중복을 제거
    const disArr = Array.from(disSet) // 배열로 변환
    if (disArr.length > k){
        return disArr.slice(0, k)
    }else{
        const answer = disArr.concat(Array(k - disArr.length).fill(-1))
        return answer;
    }
}

arr배열에는 중복되는 요소들이 존재할 수 있기 때문에 중복을 제거하기 위해서 set을 사용한다. 

set이 순서를 보장하지 않지만, 문제에서 '무작위로 수를 뽑은 후'라고 명시했기 때문에 상관이 없다. 

set은 객체 형태이기 때문에 다시 배열로 변환을 해야 하는데 Array.from()을 사용해 준다. 

여기까지 하면 문제에서 요구한 -1을 제외한 배열이 완성이 되는데

문제에서 요구한 것은 배열의 길이가 k가 돼야 한다는 것이다. 

배열의 길이가 k를 넘어가면 slice로 자르고 반환하고

k보다 작다면 k에서 배열의 길이를 뺀 만큼 배열을 생성해서 fill메서드로 -1을 채운 후 앞에서 만든 배열과 합친 후 반환한다. 

 

function solution(arr, k) {
    var answer = [];
    for (let i = 0; i < arr.length; i++){
        if (answer.length !== k && !answer.includes(arr[i])){
            answer.push(arr[i])
        }
    }
    for (let i = 0; i < k; i++){
        if (answer.length !== k){
            answer.push(-1)
        }
    }
    return answer;
}

리뷰

푸는 방법은 알겠는데 왜 통과가 안 되는 건지 엄청 답답했었다. 

위의 else 조건문에서 for문을 사용하여 'k - 배열 길이'만큼 반복하여 -1을 추가하도록 코드를 짰는데 

for문을 사용하면 히든 테스트 케이스에서 통과가 안되었다. 이유를 모르겠어서 gpt에게 물어보았더니

반복을 하면서 배열의 길이가 변하는 것이 오류를 불러올 수 있다고 했다.