🗃️javascript/프로그래머스
가까운 수(Lv.0)[문제를 풀 방법을 모르겠으면 세분화해서 생각하자]
하얀성
2023. 1. 12. 11:36
문제 설명
제한사항
입출력 예arraynresult
입출력 예 설명
정수 배열 array와 정수 n이 매개변수로 주어질 때, array에 들어있는 정수 중 n과 가장 가까운 수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ array의 길이 ≤ 100
- 1 ≤ array의 원소 ≤ 100
- 1 ≤ n ≤ 100
- 가장 가까운 수가 여러 개일 경우 더 작은 수를 return 합니다.
입출력 예arraynresult
[3, 10, 28] | 20 | 28 |
[10, 11, 12] | 13 | 12 |
입출력 예 설명
입출력 예 #1
- 3, 10, 28 중 20과 가장 가까운 수는 28입니다.
입출력 예 #2
- 10, 11, 12 중 13과 가장 가까운 수는 12입니다.
제출 답
function solution(array, n) {
let num = 0;
let array1 = []; // n미만인 애들 모으기
let array2 = []; // n이상인 애들 모으기
for(let i=0; i<array.length; i++){
if(array[i] - n >= 0){ // n이상인 애들
array2.push(Math.abs(array[i]-n))
array2.sort((a,b)=> a-b)
}else{ // n 미만인 애들
array1.push(Math.abs(array[i]-n))
array1.sort((a,b)=> a-b)
}
}
if(array1.length == 0){
return n+ array2[0]
}else if(array2.length == 0){
return n - array1[0]
}else{
return array1[0] > array2[0]? n+ array2[0] : n- array1[0]
}
}
식이 복잡한 이유는 처음에 아래같은 코드로 절댓값을 이용해 풀려다가 전 문제에 직면했기 때문이다.
function solution(array, n) {
const array2 = array.sort((a,b) => a-b);
return array2.map(x => Math.abs(x-n)).sort((a,b) => a-b)[0]+n
}
n과 각 배열요소를 빼서 절댓값 제일 작은 거 불러오기
근데 절댓값쓰면 그 값을 다시 원상복구해서 return 하는게 어려움.
값들을 Math.abs로 다 통일해서 바꿔서 값비교 한뒤에, 원상복구하는 방법을 고민하다 내 머리가 터질 것 같았다.
우선 값들을 n기준으로 나누고 각각 대응했다.
array[i]가 n 보다 작으면 빼주고
array[i]가 n 보다 크면 더해주기
모르면 세분화해야된다. 코드가 복잡하긴 한데.. 그래도 풀긴 풀었다.
아래 코드는 내가 처음 접근한 방식으로 누가 접근해놨길래 들고와봤는데ㅋㅋㅋㅋㅋㅋ 미치겠다. 이건 내가 혼자 떠올리기 어렵다.
let solution=(r,n)=>r.map(e=>[e,Math.abs(e-n)]).sort((a,b)=>a[1]-b[1]||a[0]-b[0])[0][0]