[프로그래머스] Lv.0 가까운 수 JavaScript

Janet·2023년 4월 7일
1

Algorithm

목록 보기
123/314

문제 설명

정수 배열 array와 정수 n이 매개변수로 주어질 때, array에 들어있는 정수 중 n과 가장 가까운 수를 return 하도록 solution 함수를 완성해주세요.


제한사항

  • 1 ≤ array의 길이 ≤ 100
  • 1 ≤ array의 원소 ≤ 100
  • 1 ≤ n ≤ 100
  • 가장 가까운 수가 여러 개일 경우 더 작은 수를 return 합니다.

입출력 예

arraynresult
[3, 10, 28]2028
[10, 11, 12]1312

입출력 예 설명

입출력 예 #1

  • 3, 10, 28 중 20과 가장 가까운 수는 28입니다.

입출력 예 #2

  • 10, 11, 12 중 13과 가장 가까운 수는 12입니다.

※ 공지 - 2023년 3월 29일 테스트 케이스가 추가되었습니다. 기존에 제출한 코드가 통과하지 못할 수도 있습니다.


문제풀이

💡 문제풀이 과정

  • 답안 1번: 가장 가까운 수가 여러 개일 경우 더 작은 수를 리턴해야 한다는 제한사항이 있으므로 주어진 array 배열을 sort()로 오름 차순 정렬하고 map()을 이용하여 빈 배열 diffarray의 원소 - 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];
}
profile
😸

0개의 댓글