문제
https://school.programmers.co.kr/learn/courses/30/lessons/120890
풀이
가장 가까운 수를 어떻게 찾을까 고민하다가 첫번째로 든 생각..
우선, 해당 숫자를 배열에 추가한 후 정렬한다. 앞, 뒤 숫자를 비교한 후 더 가까운 수를 리턴한다.
코드로 정리해 보자
1. 해당 숫자를 포함한 배열을 오름차순으로 정렬한다.
2. 해당 숫자의 위치(인덱스)를 찾아 앞, 뒤 숫자를 구한다.
이때 앞, 뒤의 값이 없을 경우를 대비해 0을 할당해준다.
3. 0이 들어올 경우, 반대편 값을 리턴 (값이 무조건 있다는게 조건이기 때문)
4.그외의 케이스는 해당 숫자와 앞, 뒤 숫자들의 각각 차를 구해 절댓값을 씌워준 후 비교한다.
절대값이 arrAf가 더 크다면 arrBf가 해당 숫자와 더 가까운 것이고,
arrAf, arrBf 두 값이 같거나, arrBf가 더 큰 경우에는 arrAf을 더 가까운 것으로 판정하면 된다.
function solution(array, n) {
const arr = [...array, n].sort((a,b) => a-b);
const findNum = arr.indexOf(n)
const arrBf = arr[findNum+1] || 0 //값이 없을 수도 있으므로
const arrAf = arr[findNum-1] || 0
if(arrAf === 0) return arrBf
if(arrBf === 0) return arrAf
return Math.abs(n-arrBf) < Math.abs(n-arrAf) ? arrBf : arrAf
}
if문을 처음에 작성하지 않았는데, 테스트 케이스 17, 18번에 걸려서 추가했다.
입력값 〉 [2, 3, 4], 1
기댓값 〉 2
arrAf 즉 앞의 값은 없지만 절댓값의 차가 동일한 케이스가 있다..!!!
그 경우의 수를 피하기 위해 앞에서 값이 없는 경우에 반대편 숫자를 리턴해줬다.
다른풀이
function solution(array, n) {
array.sort((a, b) => Math.abs(n - a) - Math.abs(n - b) || a - b);
return array[0];
}
정렬할때 기준을 가까운 순대로(얼마나 차이나는지) 정렬한 후, 그값이 동일하면 오름차순으로 정렬한다.
그리고 배열의 첫번째(가까우면서 가장 작은 수)를 리턴해준다.
'개발 > 알고리즘(코딩테스트)' 카테고리의 다른 글
프로그래머스, 자바스크립트) k의 개수 (0) | 2024.01.14 |
---|---|
프로그래머스, 자바스크립트) 2차원으로 만들기 (0) | 2024.01.14 |
프로그래머스, 자바스크립트) 세 개의 구분자 (1) | 2024.01.11 |
프로그래머스, 자바스크립트) 빈 배열에 추가, 삭제하기 (0) | 2024.01.11 |
프로그래머스, 자바스크립트) 문자열 뒤집기 (0) | 2024.01.11 |