배열 오름차순 정렬 하기 알고리즘 풀이 하기

2021. 7. 11. 18:07JS/알고리즘

getIndexToIns([10, 20, 30, 40, 50], 35) should return 3

문제는 위와 같이 35가 가져야 할 index 값을 반환해야 합니다. 35는 30보다는 크고 40보다는 작으므로 inxdex 3번째 자리에 와야 맞습니다.

초보자적인 제가 푼 코드입니다. 이 방법은 곧 너무 쓸데없이? 확인을 많이 한 것과 같다는 걸 알게 되었습니다. 

일단 arr.sort((a,b)=> a-b);라는 오름차순 정렬 코드를 알아내고 적용하였습니다. 숫자가 랜덤 하게 적힐지도 모르니 먼저 배열에 있는 수자를 오름차순 정렬해줘야 합니다. 그 오름차순을 적용한 배열을 새로운 변수에 집어넣었습니다.

그리고 for 문을 이용하여 변수의 length 만큼 반복합니다. 

if에서 num 보다  indexarr[i]의 값이 크다면 그 자리의 index를 바로 return 합니다. 그런데 만약 배열이 빈 arr라면 return 0을 합니다.

그런데 또 for을 다 반복하고 num보다 큰 숫자가 없다면 arr.length를 반환합니다. 배열은 0부터 시작하지만 length는 1부터 세기 때문에 항상 배열의 최대 index 보다 1 크기 때문에 가장 끝의 자리 index 값을 넘긴 것과 같다고 할 수 있습니다.

하지만 해설 첫 번째 코드에서 제가 푼 코드는 좀 복잡하고 쓸데없이 확인을 했다는 걸 알 수 있었습니다. 

일단 arr를 바로 변수 없이 오름차순 하고 for문을 arr.length만큼 반복합니다. if는 참일 때 실행이 되므로 arr가 비어 있는지 등 확인할 필요가 없습니다. arr가 비어 있다면 바로 for문을 나와 arr.length로 가는데 일단 비어있으므로 length도 0이므로 0이 자연스럽게 반환되기 때문입니다. 마찬가지로 num보다 큰 수가 없어도 빠져나와 length를 반환하면 됩니다.

그리고 해설 두 번째 fliter를 이용한 방법이 있었습니다. 와.. 이 방법도 너무 괜찮은데요. 이런 방법을 언제쯤 생각해 낼 수 있을지.. 

예를 들어 console.log(getIndexToIns([5, 3, 20, 3], 5)) 이러한 숫자 배열로 함수를 호출한다고 하면 

fliter는 배열에 있는 숫자를 하나씩 val이라는 매개변수로 받아서 num과 크기 비교를 합니다. num보다 작은 숫자만 fliter 해서 arr에 넘기고 그 length를 받아 return 합니다. 그러니까 위에 호출로 하면 [3.3]이 되고 3이 return 되는 것이죠.

해설 세 번째 방법은 findIndex를 이용했다는 것입니다. 먼저 sort로  arr 배열의 값을 오름차순 해주고 findIndex에 배열의 값을 currNum이라는 매개변수로 받아서 num과 비교합니다. num보다 크거나 같은 index를 찾아서 그것을 변수에 할당하고 return 문에서 그 값이 -1 (false)인지 확인을 합니다. 맞다면 num보다 크거나 같은 값이 없었으므로 length를 반환하고 아니면 index를 반환합니다. 

해설 네 번째 방법은 indexOf를 이용한 간단한 방법입니다. 일단 arr에 num을 concat을 이용해 추가합니다. 그럼 arr는 num의 값도 들어 있는 배열이 됩니다. 그리고 그 arr를 오름차순 하는 것입니다. 그리고 그 arr에 들어 있는 num의 indexOf를 이용해 index값을 구하면 끝입니다. 아아.. 정말 간단한 방법.. 댓글에는 보면 concat 말고 push 하는 방법도 있습니다.