function solution(array, n) {
let ans = [];
array.forEach((item) => {
ans.push(Math.abs(item - n));
})
const min = Math.min(...ans);
if(ans.indexOf(min) !== ans.lastIndexOf(min)){
const indexOne = ans.indexOf(min);
const indexTwo = ans.lastIndexOf(min);
return array[indexOne] > array[indexTwo] ? array[indexTwo] : array[indexOne];
}
const indexOfMin = ans.indexOf(Math.min(...ans));
return array[indexOfMin];
}
만약, 두 수의 차이가 중복되는 경우가 없다면 굉장히 쉽게 끝나는 문제지만,
두 수의 차가 같은 경우가 존재할 수 있다.
그럴 경우 값의 차를 저장해놓은 배열 ans
에서 인덱스가 다르게 나올 것이며,
이 때, 가장 앞의 인덱스와 가장 뒤의 인덱스를 각각 저장하여
두 값을 비교, 더 작은 값을 반환한다.
만약 주어진 3개의 숫자가 중복되는 값이 존재한다고 할 때도 문제가 될 것이라고 생각되는데,
예시를 들어보자.
array
는 아래와 같고, n
은 2라고 해보자.
[1,3,1]
[1,1,3]
[3,1,1]
[3,1,3]
[3,3,1]
[1,3,3]
이렇게 경우의 수가 나온다.
위의 3가지 케이스는 문제가 없다.
어떻게 하든 1이 출력되기 때문이다.
그런데 밑의 3가지 케이스는 문제가 있다.
[3,1,3]
, [3,3,1]
인 경우는 1이 출력이 되어야하는데 3이 나온다.
그런데, 위 코드는 통과되었다. 테스트 케이스에는 이런 경우가 없었던 모양이다.
그래서 저런 경우까지 포함하여 연산할 수 있도록 코드를 수정했다.
function solution(array, n) {
let ans = [];
array.forEach((item) => {
ans.push(Math.abs(item - n));
})
const min = Math.min(...ans);
let check = [];
for(let index = 0; index < ans.length; index++){
if(ans[index] === min){
check.push(array[index]);
}
}
return Math.min(...check);
}
ans
배열에는 두 값의 차이가 들어가며, ans
배열의 최소값 min
을 구한다.
ans
배열의 길이만큼 반복하면서 ans
의 원소값이 min
과 같다면,
같은 인덱스에 있는 array
의 원소를 check
배열에 넣는다.
따라서, check
배열에는 item - n
연산에서 같은 값을 가지는 원소들이 들어오게 된다.
check
배열에서 최소값을 찾으면 그 것이 바로
n
과의 차이가 가장 작으면서, 그 후보들 중에서 가장 작은 값이 된다.