[프로그래머스 | Javascript] 코딩테스트 입문 - 가까운 수

박기영·2022년 11월 8일
0

프로그래머스

목록 보기
76/159

통과는 되는데...

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이 나온다.
그런데, 위 코드는 통과되었다. 테스트 케이스에는 이런 경우가 없었던 모양이다.

solution

그래서 저런 경우까지 포함하여 연산할 수 있도록 코드를 수정했다.

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과의 차이가 가장 작으면서, 그 후보들 중에서 가장 작은 값이 된다.

profile
나를 믿는 사람들을, 실망시키지 않도록

0개의 댓글