정수 배열 array
와 정수 n
이 매개변수로 주어질 때, array
에 들어있는 정수 중 n
과 가장 가까운 수를 return 하도록 solution 함수를 완성해주세요.
array
의 길이 ≤ 100array
의 원소 ≤ 100n
≤ 100array | n | result |
---|---|---|
[3, 10, 28] | 20 | 28 |
[10, 11, 12] | 13 | 12 |
입출력 예 #1
입출력 예 #2
※ 공지 - 2023년 3월 29일 테스트 케이스가 추가되었습니다. 기존에 제출한 코드가 통과하지 못할 수도 있습니다.
💡 문제풀이 과정
- 답안 1번: 가장 가까운 수가 여러 개일 경우 더 작은 수를 리턴해야 한다는 제한사항이 있으므로 주어진
array
배열을sort()
로 오름 차순 정렬하고map()
을 이용하여 빈 배열diff
에array의 원소 - n
값을push()
하여 담는데, 음수가 나올 경우도 있으므로Math.abs()
를 사용하여절대값(absolute value)
으로 담는다. 따라서diff
배열에서 가장 작은 수가n
과 가장 가까운 수가 되므로, 리턴할 것은diff
배열에서최저값
의 인덱스를 찾으면 된다.array[diff.indexOf(Math.min.apply(null, diff))];
- 답안 2번:
sort()
만으로 간단히 해결할 수 있었던 다른 사람의 풀이이다. 답안 1번과 마찬가지로Math.abs()
메소드를 사용하여array.sort((a, b) ⇒ Math.abs(n - a) - Math.abs(n - b) || a - b);
하면array의 원소
에서n
을 뺀 값의 절대값이 오름 차순으로 정렬되는데 이 때 array 배열의 원소 값들은 변형시키지 않으면서 유지할 수 있다. 때문에 리턴할 값은array의 첫 번째 원소
가 된다. cf. sort()함수 마지막 파트에서 || a - b를 붙여줘야 하는 이유? 다음 예제 참고 ⬇️let array = [1, 6, 4]; let n = 5; //6과 4는 n을 뺐을 때의 절대값은 1로 동일하다. //But, 가장 가까운 수가 여러 개일 경우 더 작은 수를 리턴해야 한다는 제한사항이 있다는 점 유의. array.sort((a, b) => Math.abs(n - a) - Math.abs(n - b) || a - b); // [4, 6, 1] array.sort((a, b) => Math.abs(n - a) - Math.abs(n - b)); // [6, 4, 1]
✅ 답안 #1
function solution(array, n) {
let diff = [];
array.sort((a, b) => a - b).map((v) => diff.push(Math.abs(v - n)));
return array[diff.indexOf(Math.min.apply(null, diff))];
}
✅ 답안 #2
function solution(array, n) {
array.sort((a, b) => Math.abs(n - a) - Math.abs(n - b) || a - b);
return array[0];
}