배운 코드 정리

min, splice, filter, apply

fpzmfks 2024. 7. 11. 16:23

오늘은 2개의 코드카타를 했는데, 2번째 문제에서 막혔다. splice로 배열의 최소값을 제거하려고 하니까 자꾸만 이상한 결과값이 나오는 것이다. 여러가지를 검색해보았고, 먼저 filter를 사용하였지만 다른 방법으로도 다시 문제를 풀어보았다. 

 

최초로 내가 성공한 해답은 이것이다. 

 

function solution(arr) {
    var answer = [];
    let minval = Math.min.apply(null, arr);
    
    arr = arr.filter((e) => e !== minval);
    
    answer = arr;
    if(answer==0) {
        return [-1];
    }
    return answer;
}

 

math.min.apply(null, arr)로 최소값을 구하고 arr.filter로 arr 배열에서 최소값을 제외한 배열을 새로 작성한 것이다. math.min만으로는 배열의 최소값을 구할 수 없기 때문에 apply가 사용된 모습인데, apply 함수는 apply(함수, (배열 등등))의 형태로 사용되는 함수로 함수 자리에 null이 들어갔기 때문에 '배열 등등' 자리에 넣은 arr 배열이 math.min이 바라는 고유한 변수로 변환된 것이다. 이렇게 arr 배열을 고유한 변수로 변환하는 것에는 한 가지 더 방법이 있는데 바로 (...arr)이다. 이는 구조분해할당이라고 하는데, 사실 자세한 내용을 읽어보아도 아직은 자세하게는 이해할 수 없었고, '...' 뒤에 오는 일종의 매개변수('개체'라고 부르는 것을 읽었다)의 값을 추출하여 사용할 수 있는 식이다. 또 다르게 사용하면 값을 할당해주는 것도 가능하다고 한다. 이러한 (...arr)는 위의 식에서 apply(null,arr)와 똑같이 사용될 수 있어 앞으로는 배열의 값을 추출할 때는 보다 간단한 (...arr)를 사용하면 될 것 같다. 


 

어쨌든 이렇게 최소값을 구하는 것은 비교적 초반에 발견하고 써먹었던 것인데, 이상하게도 그때는 이상한 결과값만이 나왔다. 그리고 다른 사람의 풀이를 보고, 내가 최소값을 잘못 구했던 것이 아니라 splice를 잘못 이해했던 것이라는 걸 깨달았다. 

 

splicearr.splice(index,(index로부터 몇 번째까지 삭제할 것인지), (삭제한 자리에 어떤 값을 추가할 것인지))의 형태로 사용할 수 있는 배열 수정 함수이다. 내가 잘못 이해했던 것은 splice 함수의 index 자리에 배열의 값을 입력하면 해당 값만을 삭제해 주기를 기대했던 것이다.

 

실제 구조는 

만약 arr =[4,3,2]이고

구한 최소값이 2라고 했을 때

 

arr.splice(2,1)을 입력하면 배열의 2번째 값을 하나 삭제해서

arr = [4,2]가 된다. 

 

때문에 내가 기대했던 arr 배열에서 2가 삭제된 [4,3]이 출력되지 않는 것이다. 

 

이 함수를 올바르게 사용하려면 구한 최소값 2를 가지고 먼저 2가 해당 배열에서 몇 번째에 있는지 index 값을 구해야 한다. 

 

그래서

 

function solution(arr) {
    var answer = [];
    let minval = Math.min(...arr);
    
    let index = arr.indexOf(minval);
    
    arr.splice(index,1);
    
    answer = arr;
    if(answer==0) {
        return [-1];
    }
    return answer;
}

 

가 완성되었고, 이 함수에서는 기대했던 arr 배열에서 2가 삭제된 [4,3] 이 출력된다. 

 

이렇게 장황하게 정리해 보았지만 정리하자면 전체적으로 매개변수에 대한 이해가 부족했기 때문에 생겨난 오류들이다. 이제 조금씩 코드카타에 익숙해졌지만, 아직 함수에 대한 공부가 많이 필요한 시점인 것이다. 

'배운 코드 정리' 카테고리의 다른 글

발행자/구독자 패턴  (0) 2024.09.11
indexOf, sort  (0) 2024.07.09
돌아온 정수 제곱근 판별  (0) 2024.07.02
자연수 뒤집기  (0) 2024.07.01
배열의 평균 값  (0) 2024.06.21