프로그래머스 입문 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에서 거리가 같으면서 현재 원소가 기존의 가장 가까운 값보다 작은지 한 번 더 확인한다.