JavaScript/알고리즘

프로그래머스 제일 작은 수 제거하기 JS ( findIndex(), splice() )

hihiha2 2023. 9. 2. 06:40

🧷링크

문제 설명

정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.

 

 

 

🙋‍♀️ 내 생각

처음에 문제를 잘못생각해서 코드를 짜서 패쓰가 안되었는데, 잘못 생각한 이유는 아래와 같다.

❌ 잘못 생각한 코드

    const arr2 = [...arr]
    arr2.sort((a,b)=>b-a).pop()
    
    return arr2.length ? arr2 : [-1]

sort()를 이용해서 arr안에 들어있는 값들을 내림차순으로 정렬한 뒤, pop()을 통해 가장 마지막 값을 제거했다. 

이렇게 하면 자연스럽게 가장 작은 값이 마지막으로 가고 제거가 된다.

[10]과 같이 arr안에 값이 하나만 있는 경우에는 pop()하고 나면 빈배열만 남는다.

 

이런 것을 이용해서 length삼항연산자을 통해, length가 0인경우에는 [-1]를, 그렇지 않으면 arr를 리턴한다.

 

입출력예는 잘 통과를 했는데, 답을 제출하면 통과가 안됐다.

 

이유가 뭘까..하고 계속 생각하다보니 혹시..? 하는 생각이 들었다.

나는 arr을 sort를 하고 시작했는데, 이렇게하면 전체적인 arr의 순서가 바뀐다.

위와 같이 [4,3,2,1]로 내림차순된 배열이라면 상관이 없겠지만 [1,2,3,4]였다면 sort()를 통해 [4,3,2,1]로 바뀌고 pop()으로 1을 제거하면 결국 [4,3,2]가 리턴될 것이다. 배열안의 숫자의 순서가 바껴서 원래 위 코드에서 원하던 답인 [2,3,4]가 나오지 않는 것이다.

 

➡️ 배열의 순서도 신경쓰자!! 😵

 

 

그래서 인덱스를 변화시키지 않는 방법을 다시 생각했다..! 🤔

Math.min()을 이용해서 arr안의 최솟값을 찾고 findIndex()로 해당하는 인덱스의 위치를 찾는다.

그러고나서 splice()을 이용해서 그 해당하는 하나의 값만을 제거한다.

 

 

 

✅ 내 코드

function solution(arr) {
    let min = Math.min(...arr)
    let index = arr.findIndex(v=>v===min)
    
    arr.splice(index,1)
    return arr.length? arr : [-1]
}

min이라는 변수를 선언하고 Math.min()을 이용해서 arr의 최솟값을 담는다.

...스프레드 연산자로 arr를 하나하나로 풀어주면서 복사한다. Math.min(...arr)

 

index라는 변수를 선언하고 findIndex()를 이용하여 arr에서 가장 작은 값을 찾는다.

 

🖥 findIndex()

findIndex는 매개변수함수가 들어간다. 이 함수안에서 찾고 싶은 값을 검사한다.

findIndex에서 해당하는 값을 찾으면 가장 맨 처음 찾은 값의 인덱스를 반환하고 끝난다.

일치하는 값이 없다면 -1을 반환한다.

findIndex(callbackFn)
findIndex(callbackFn, thisArg)

 

가장 작은 값의 인덱스를 찾았으면 해당값을 제거해야한다.

제거하게 위해서 splice()를 이용한다. splice()을 이용하면 어디부터 시작해서 얼마나 자를지를 결정할 수 있다.

 

🖥 splice()

splice는 매개변수로 시작점, 제거할 수, 추가할 요소가 들어간다.

    array.splice(start[, deleteCount[, item1[, item2[, ...]]]])

 

arr.splice(index,1)을 하면 index부터 시작해서 1개의 요소만을 제거한다. 

즉, 바로 그 해당요소만을 제거하는 것이다.

 

그리고 마지막으로 length와 삼항연산자를 이용해서 length가 0인 경우 [-1]을 그렇지 않으면 arr를 반환한다.

 

 

 

🙋‍♀️ 내 생각

조건을 만족했지만 배열의 순서를 신경쓰지 않고 문제를 풀어서 시간이 더 걸렸던 것 같다.

배열과 관련된 문제를 풀때는 배열안에 들어있는 각 요소들의 순서도 신경을 써서 풀어야겠다..!!

잊지 말자 순서!! 👩‍💻👩‍💻👩‍💻