N Log

프로그래머스 입문 120890 가까운 수

문제

출처

배열 array에 담긴 수 중에서 정수 n과 가장 가까운 수를 반환하시오.
단, n과의 거리가 같은 수가 여러 개라면 그중 가장 작은 수를 반환한다.

array n result
[3, 10, 28] 20 28
[10, 11, 12] 13 12
[1, 3, 5] 4 3
[5, 3, 1] 4 3

풀이

#include <stdlib.h>

int solution(int array[], size_t array_len, int n)
{
    int nearest = array[0];
    int min_distance = abs(array[0] - n);

    for (int i = 1; i < array_len; i++)
    {
        int distance = abs(array[i] - n);

        if (distance < min_distance)
        {
            nearest = array[i];
            min_distance = distance;
        }
        else if (distance == min_distance && array[i] < nearest)
        {
            nearest = array[i];
        }
    }

    return nearest;
}

이 문제는 최솟값을 찾는 방식과 비슷하게 풀 수 있다.
다만 값 자체의 최솟값이 아니라 n과 각 원소 사이의 거리 중 최솟값을 찾으면 된다.
반복문을 돌면서 현재 원소와 n의 거리를 구하고, 이 거리가 기존 최소 거리보다 작으면 가장 가까운 값과 최소 거리를 함께 갱신한다.
또한 문제를 보면 거리가 같은 경우에는 더 작은 수를 반환해야 한다.
따라서 else if에서 거리가 같으면서 현재 원소가 기존의 가장 가까운 값보다 작은지 한 번 더 확인한다.