[프로그래머스 코딩테스트 기초] 무작위로 K개의 수 뽑기 | 알고리즘 설명 & 문제 풀이 with 자바스크립트(Javascript)

Re_Go·2023년 12월 18일
0

코딩테스트연습

목록 보기
35/106
post-thumbnail

1. 문제 설명

2. 제한 사항

3. 입출력 예

4. 입출력 예 설명

5. 첫번째 문제 풀이(2023-12-18)

이 문제의 경우 for문을 돌려 arr의 앞의 값과 뒤의 값이 다를 때 앞의 값을 앞의 값을 result 배열에 할당하는 식으로 문제를 해결하려 했습니다. 그런데 제가 생각한 대로 예시 테스트 케이스는 통과를 했는데 실제로 코드를 제출할때는 통과를 하지 못하더군요...

그래서 gpt 찬스를 사용했는데 중복 여부를 판단할 때 indexOf 메서드를 사용하더라고요? 보고 감탄할 수 밖에 없었습니다. 그래서 해당 메서드를 사용해서 문제를 풀게 되었습니다. (물론 Set 메서드를 사용해도 되는데 그럴 경우 Array.from 메서드로 형변환을 해줘야 해서...)

여기서 알게된 점은 indexOf 메서드를 사용할 때 해당 값이 존재하지 않을 경우 -1을 반환한다라는 겁니다. 이를 통해 해당 배열에 값이 존재할 경우(인덱스가 있어서 -1와 같지 않을 경우)에는 무시하고, 값이 없을 경우(-1을 반환하므로 -1와 같은 경우) 해당 값을 result 배열에 push하는 식으로 코드를 구현했습니다.

function solution(arr, k) {

    let result = [arr[0]]; // result 배열에 미리 arr의 첫번째 요소를 저장하고
 
    for (let i = 1; i < arr.length; i++) { // i를 1부터 시작해 arr의 배열만큼 도는 동안(어차피 첫번째 요소는 담겨 있는 상태이므로 1부터 시작해도 됩니다.)
        if (result.indexOf(arr[i]) === -1) { // result의 배열에서 arr의 i번째 값 인덱스가 -1인 상태 (없는 상태) 라면 
            result.push(arr[i]); // result 배열에 해당 arr의 i번째 값을 추가합니다.
        }
     
        if (result.length === k) { // 만약 result의 길이와 k의 길이가 같으면 for문 종료
            break;
        }
    }

    while (result.length < k) { // result 배열의 길이가 k보다 작을 경우, 그러니까 k에 미달 되었을 때
        result.push(-1); // 남은 빈자리를 -1로 채웁니다.
    }

    return result;
}

참고로 원래 for문의 첫번째 중복 체크 여부 코드는 아래와 같았습니다.

 if (arr[i] !== arr[i-1]) {
            result.push(arr[i]);
    }
profile
인생은 본인의 삶을 곱씹어보는 R과 타인의 삶을 배워 나아가는 L의 연속이다.

0개의 댓글