문제 설명
정수를 저장한 배열, 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를 반환한다.
🙋♀️ 내 생각
조건을 만족했지만 배열의 순서를 신경쓰지 않고 문제를 풀어서 시간이 더 걸렸던 것 같다.
배열과 관련된 문제를 풀때는 배열안에 들어있는 각 요소들의 순서도 신경을 써서 풀어야겠다..!!
잊지 말자 순서!! 👩💻👩💻👩💻
'JavaScript > 알고리즘' 카테고리의 다른 글
프로그래머스 문자열 내 p와 y의 개수 JS ( split()으로 특정 문자열 몇개 포함하는지 구하기 ) (0) | 2023.09.11 |
---|---|
프로그래머스 서울에서 김서방 찾기 JS ( findIndex(), indexOf(), 템플릿문자열 ) (0) | 2023.09.04 |
프로그래머스 두 정수 사이의 합 JS ( for문 / 가우스 합계) (0) | 2023.09.02 |
프로그래머스 자연수 뒤집어 배열로 만들기 JS (0) | 2023.08.26 |
프로그래머스 x만큼 간격이 있는 n개의 숫자 JS (0) | 2023.08.25 |