문제 설명
정수 배열 array와 정수 n이 매개변수로 주어질 때, array에 들어있는 정수 중 n과 가장 가까운 수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ array의 길이 ≤ 100
- 1 ≤ array의 원소 ≤ 100
- 1 ≤ n ≤ 100
- 가장 가까운 수가 여러 개일 경우 더 작은 수를 return 합니다.
입출력 예
Array | n | result |
[3, 10, 28] | 20 | 28 |
[10, 11, 12] | 13 | 12 |
문제를 보고 바로 생각해본 풀이
function solution(array, n) {
let newArr = [...array,n].sort((a,b)=>a-b);
if(newArr.indexOf(n) === 0) return newArr[newArr.indexOf(n)+1];
if(newArr.indexOf(n) === newArr.length-1) return newArr[newArr.indexOf(n)-1];
return (Math.abs(newArr[newArr.indexOf(n)-1]-n) > Math.abs(newArr[newArr.indexOf(n)+1]-n) ?
newArr[newArr.indexOf(n)+1] : newArr[newArr.indexOf(n)-1])
}
배열에 n을 삽입 후 정렬하여 n 양 옆에 있는 숫자를 비교하는 방식으로 풀었지만
불필요한 연산이 너무 많고 시간복잡도가 높다는 생각이 들었다. 그래서 풀이 제출 전에 개선을 해보고 싶은 생각이 들어
다른 풀이를 고민 해보았다.
새로 생각해 본 풀이
function solution(array, n) {
array.sort((a,b)=>a-b)
array.sort((a,b)=>Math.abs(n-a)<Math.abs(n-b) ? -1 : 1)
return array[0]
}
배열의 정렬 기능만을 사용해 풀어 보았다.
1차적으로 크기 순으로 정렬 하고
2차적으로 n과 배열의 요소 간의 거리를 비교해 가까운 순으로 정렬했다. 거리가 같은 경우에는 작은 숫자가 오도록 하기위해 연산자를 위와 같이 설정했고, 1차적으로 크기 순으로 정렬한 이유도 이를 위해서 이다.
결과적으로 배열의 첫번째 요소가 가장 가까운 숫자가 된다. (※ sort 메소드는 원본 값을 수정한다는 것 을 참고 하자)
이렇게 풀이를 개선했더니 연산 속도가 0.06ms => 0.03ms 로 개선되었다.
다른 분 들 풀이
function solution(array, n) {
array.sort((a,b) => Math.abs(n - a) - Math.abs(n - b) || a - b);
return array[0];
}
나와 동일한 방식으로 접근하셨다. 다만, 나는 2번으로 나눠서 한 정렬을 한번에 처리하신 점이 마음에 들었다.
'Algorithm > 푼 문제' 카테고리의 다른 글
프로그레머스/Lv0/약수 구하기 (0) | 2023.03.31 |
---|---|
프로그래머스/Lv2/이진 변환 반복하기 (0) | 2023.03.30 |
프로그레머스/Lv0/직사각형 넓이 구하기 (1) | 2023.03.24 |
프로그레머스/Lv0/잘라서 배열로 저장하기(미완성) (0) | 2023.03.24 |
프로그래머스/Lv1/2016년 (0) | 2023.03.24 |