문제 설명
정수 배열 array와 정수 n이 매개변수로 주어질 때, array에 들어있는 정수 중 n과 가장 가까운 수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ array의 길이 ≤ 100
- 1 ≤ array의 원소 ≤ 100
- 1 ≤ n ≤ 100
- 가장 가까운 수가 여러 개일 경우 더 작은 수를 return 합니다.
풀이
map() 과 sort()를 사용해서 풀었다.
const solution = (array, n) =>
array[array
.map((el, idx) => [Math.abs(el - n), idx])
.sort((a,b) => {
if(a[0] === b[0]){
return array[a[1]] - array[b[1]]
}else{
return a[0] - b[0]
}
})[0][1]]
우선 map() 매서드를 이용해서 [원본 배열의 원소에서 n을 뺀 절대값, 원본 배열에서의 인덱스] 의 형태로 새로운 배열을 만든 뒤, sort() 매서드를 이용해서, 원본 배열의 원소에서 n을 뺀 절대값이 같을 경우 원본 끼리 비교해서 작은수를, 같지 않은 경우 원본 배열의 원소에서 n을 뺀 절대값이 작은 순서로 재정렬을 한뒤, 해당 배열의 첫번째 원소의 두번째 원소(원본 배열의 인덱스)를 리턴 후 array에서 해당번째 인덱스를 리턴해주는 array[#]로 반환해주었다.
뭔가 불필요하게 이런저런짓을 많이 한것 같아서 다른 사람의 풀이를 참고 해봤는데,
const solution = (array, n) => {
array.sort((a,b) => Math.abs(n - a) - Math.abs(n - b) || a - b);
return array[0];
}
이런식으로 간결하게도 표현이 가능했다.
굳이 map()이나 reduce들을 사용하지 않고도 처리 할 방법이 많으니 다음부턴 코드를 작성할때 좀더 생각을 해봐야겠다.
sort() 매서드의 콜백함수 내에서 다양한 시도를 해보는것도 나쁘진 않을듯.