[프로그래머스] 가까운 수

이아현·2023년 6월 2일
0

코딩테스트

목록 보기
7/31
post-thumbnail

✅ 문제 설명

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

✅ 제한 사항

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

✅ 첫 번째 풀이

function solution(array, n) {
    var answer = 0;
    var filter_arr = array.map(number=>Math.abs(number-n))
    var min_num = filter_arr.indexOf(Math.min(...filter_arr))
    answer = array[min_num]
    
    return answer;
}
  • 이렇게 풀었을 때 5번, 13번 테스트케이스가 계속 틀렸다고 나왔다.
  • 제한 사항을 제대로 읽지 않았다.
    • array가 [ -5, 5]이고 n이 5이면 -5와 5 둘다 최솟값이 될 수 있다.
    • 하지만 indexOf의 경우에는 조건에 맞는 가장 첫번째 값을 반환하기 때문에 답이 틀렸던 것이다.

✅ 두 번째 풀이 (통과)

function solution(array, n) {
    var answer = 0;
    // (절대값 - n)한 최솟값을 절대값으로 바꾸기
    var filter_arr = array.map(number=>(Math.abs(number)-n))
    var abs_arr = filter_arr.map(number => Math.abs(number))
    // 절대값 중 최솟값 찾기
    var min_num = Math.min(...abs_arr)
    // 최솟값들을 담을 lst
    var lst = []
    // 최솟값에 해당하는 값들의 array값을 lst에 담기
    for (let i=0; i<abs_arr.length; i++) {
        if (abs_arr[i] === min_num) {
            lst.push(array[i])
        }
    }
    //lst중 최솟값 담기
    answer = Math.min(...lst)
    
    return answer;
}
  • 일단 Math.minMath.max를 배열에서 쓰려면 spread 연산자 ...을 써야 값이 나온다!
  • 나는 거의 일일이 하나씩 다 나열하면서 풀었다.
    1. 우선 (절대값 - n)한 값의 절대값을 담은 abs_arr로 만들어주고
    2. abs_arr의 최솟값 min_num을 찾는다.
    3. abs_arr을 for문으로 돌면서 min_num과 값이 같으면 해당 인덱스의 array값을 lst에 넣어준다.
    4. 그리고 lst중 최솟값을 answer로 반환한다.
  • 직관적으로 이해하기에는 코드가 쉬워보이지만, 뭔가 너무 구구절절 쓴 느낌이었다.
  • 더 짧게 쓸 수 있는 방법을 연구해보자!
profile
PM을 지향하는 FE 개발자 이아현입니다 :)

0개의 댓글