문제 풀기/JavaScripts

문제 29.(중요)제일 작은 수 제거하기(splice, indexOf, Math.min)

kagan-draca 2024. 7. 18. 15:43

 

나의 오류)

 

1. 일단 문제를 보고 왜 배열 안에 [10]이라고 있는데 -1이지? 생각했다.

위의 경우를 보고 arr.length == 0 || arr.length == 1이라 작성해

arr.length == 1 경우 때문에 계속 실패가 떳다.

 

다시 문제를 보니깐, 린턴하려는 배열이 빈 배열인 경우!

즉, 가장 작은 수가 제거된 배열이 빈 배열인 경우!

-1을 채워 리턴하는 문제였다...

 

2. 입출력 예시의 [4, 3, 2, 1]의 결과가 [4, 3, 2]여서

모든 결과가 내림차순 정렬이 돼야 하는줄 알고

sort((a, b)=> a - b)로 오름차순 정렬 후

slice(1, arr.lenght + 1)로 가장 작은 값을 제거하고

reverse()함수를 사용했다...

(모든 예시가 정렬 돼 있지 않다...)

 

그럼! 배열의 특정 값만 지워야 하는데

이때 사용될 함수를 찾아봐야 했다.

 

찾아본 결과 splice()함수가 존재했다.(내용이 많아서 글을 긁어 옴)

 

splice() 함수

slice() 함수의 이름에서 알파벳 p가 하나 더 있는 splice() 함수는 다목적으로 사용할 수 있는 함수인데요. 이 함수로는 배열로 부터 특정 범위를 삭제하거나 새로운 값을 추가 또는 기존 값을 대체할 수 있습니다. 첫번째 인자로 시작 인덱스(index), 두번째 인자로 몇개의 값을 삭제할지, 그리고 세번째 인자부터는 추가할 값을 가변 인자로 넘길 수 있으며, 삭제된 값을 담고 있는 배열을 반환합니다.

역시 위와 동일한 방법으로 nums라는 숫자 배열을 생성해놓고 실습을 시작하겠습니다.

> nums = Array(20).fill().map((_, i) => i)
< [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

이 숫자 배열에서 인덱스 5가 가리키는 값부터 3개의 값을 삭제해보겠습니다.

> nums.splice(5, 3)
< [5, 6, 7]
> nums
< [0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

삭제된 3개의 값을 담고 있는 배열이 반환되며, 원본 배열로 부터 3개의 값이 빠져나간 것을 알 수 있습니다.

이번에는 인덱스 5가 가리키는 값부터 아무 값도 삭제하지 않고, -5, -6, -7을 추가해보겠습니다.

> nums.splice(5, 0, -5, -6, -7)
< []
> nums
< [0, 1, 2, 3, 4, -5, -6, -7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

삭제된 값이 없으므로 빈 배열이 반환되고, 이전에 값이 삭제된 자리에 -5, -6, -7을 들어간 것을 알 수 있습니다.

이번에는 인덱스 10이 가리키는 값부터 2개의 값을 -10, -11로 대체해보겠습니다.

> nums.splice(10, 2, -10, -11)
< [10, 11]
> nums
< [0, 1, 2, 3, 4, -5, -6, -7, 8, 9, -10, -11, 12, 13, 14, 15, 16, 17, 18, 19]

삭제된 2개의 값을 담고 있는 배열이 반환되며, 원본 배열의 10, 11이 있던 자리에 -10, -11에 들어가 앉아있는 것을 볼 수 있습니다.

splice() 함수에 첫번째 인자만 넘기면 해당 인덱스가 가리키는 값을 포함해서 배열의 마지막 값까지 삭제가 됩니다.

> nums.splice(15)
< [15, 16, 17, 18, 19]
> nums
< [0, 1, 2, 3, 4, -5, -6, -7, 8, 9, -10, -11, 12, 13, 14]

splice() 함수 첫 번째 인자로 0을 넘기면 배열에 있는 모든 원소를 삭제되겠죠?

> nums.splice(0)
< [0, 1, 2, 3, 4, -5, -6, -7, 8, 9, -10, -11, 12, 13, 14]
> nums
< []

splice() 함수를 사용할 때 가장 주의할 부분은 삭제된 값을 담고 있는 새로운 배열이 반환될 뿐만 아니라 원본 배열에도 변경이 가해진다는 점입니다. 따라서 의도치 않은 데이터 유실이나 변경으로 이어질 수 있으니 특히 데이터의 불변성(immutability)이 보장되어야 하는 프로그램을 작성할 때 주의하셔야 합니다.

 

 

 

위의 내용에서 처럼 값을 제거하거나, 삽입하는 용도로 사용됐다.

 

이제 가장 작은 값을 찾아야 하는데 이때는 indexOf()나 lastIndexOf()와 Math.min() 함수를 사용하면 됐다.

 

배열 특정 값 위치(index) 찾기 - indexOf(), lastIndexOf()

1. indexOf()와 lastIndexOf() 함수 소개 

 

 indexOf() 

 

arr.indexOf(searchElement[, fromIndex])

배열 안에서 찾으려는 값(searchElement)과 정확하게 일치(===)하는  '첫번째' element의 index를 리턴합니다. 

만약, 찾으려는 값이 배열에 없으면 -1을 리턴합니다.

fromIndex를 파라미터로 전달하면, fromIndex부터 값을 찾습니다.

 

 파라미터 

searchElement

찾으려는 값

 

fromIndex

검색을 시작할 index

입력하지 않으면 0부터 검색을 시작합니다.

 

 리턴값 

배열에서 searchElement와 값이 정확하게 일치하는 첫번째 index를 리턴합니다.

찾으려는 값이 배열에 없으면 -1을 리턴합니다.

 

 lastIndexOf() 

arr.lastIndexOf(searchElement[, fromIndex])

배열 안에서 찾으려는 값(searchElement)과 정확하게 일치(===)하는 '마지막' element의 index를 리턴합니다.

만약, 찾으려는 값이 배열에 없으면 -1을 리턴합니다.

fromIndex를 파라미터로 전달하면,

fromIndex부터 역방향으로(index값을 줄여나가면서) searchElement와 같은 값을 찾아

첫번째로 같은 값을 가지는 index를 리턴합니다.

fromIndex값이 입력되지 않으면, 기본값은 (배열의 길이-1) 입니다.

즉, fromIndex값을 입력하지 않으면, lastIndexOf 함수는 배열의 끝에서부터 역방향으로 배열을 탐색하여

searchElement와 같은 값을 가지는 최초의 index값을 리턴하는 것입니다.

 

 파라미터 

searchElement

찾으려는 값

 

fromIndex

검색을 시작할 index

입력하지 않으면 arr.length-1 index부터 검색을 시작합니다.

 

 리턴값 

배열에서 searchElement와 값이 정확하게 일치하는 마지막 index를 리턴합니다.

찾으려는 값이 배열에 없으면 -1을 리턴합니다.

 

 

마지막으로 Math.max와 Math.min 함수를 살펴보면

 

 

 

 

으로 사용할 수 있었다.

 

제출한 코드 : 

 

function solution(arr) 
{
    arr.splice(arr.indexOf(Math.min(...arr)),1);
    return arr.length == 0 ? [-1] : arr
}