더북(TheBook)

31.7 근삿값 구하기: NEAR 알고리즘

근삿값(NEAR) 알고리즘은 가까운 값(근삿값)은 주어진 값과 차이가 가장 적게 나는 값을 구합니다. 앞에서 다룬 최솟값 알고리즘을 조합해서 주어진 값과 차이가 가장 작은 값을 구합니다.

 

근삿값 알고리즘 사용하기

근삿값 알고리즘을 적용하여 주어진 조건에 해당하는 데이터와 가장 가까운 수를 구하는 예제를 만들어 봅시다. 다음 내용을 입력한 후 실행해 보세요.

원본 데이터 중에서 대상 데이터와 가장 가까운 값: NearAlgorithm.cs

using System;
using System.Linq;
using static System.Console;

class NearAlgorithm
{
    static void Main()
    {
        //절댓값 구하기 로컬 함수: Math.Abs() 함수와 동일한 기능을 구현해 봄
        int Abs(int number) => (number < 0) ? -number : number;

        //① 초기화
        int min = int.MaxValue; //차이 값의 절댓값 중 최솟값이 담길 그릇

        //② 입력: 이진수와 16진수로 표현({ 10, 20, 30, 27, 17 })
        int[] numbers = { 0b1010, 0x14, 0b11110, 0x1B, 0b10001 };
        int target = 25;        //target과 가까운 값
        int near = default;     //가까운 값: 27

        //③ 처리: NEAR
        for (int i = 0; i < numbers.Length; i++)
        {
            int abs = Abs(numbers[i] - target); //차이 값의 절댓값
            if (abs < min)
            {
                min = abs;                  //MIN: 최솟값 알고리즘
                near = numbers[i];          //NEAR: 차이 값의 절댓값 중 최솟값일 때 값
            }
        }

        //④ 출력
        var minimum = numbers.Min(m => Math.Abs(m - target));
        var closest = numbers.First(c => Math.Abs(target - c) == minimum);
        WriteLine($"{target}와/과 가장 가까운 값(식) : {closest}(차이: {minimum})");
        WriteLine($"{target}와/과 가장 가까운 값(문) : {near}(차이: {min})");
    }
}

실행 결과

25와/과 가장 가까운 값(식) : 27(차이: 2)
25와/과 가장 가까운 값(문) : 27(차이: 2)

근삿값(가까운 값) 알고리즘은 최솟값 알고리즘의 변형으로, 내부적으로 최솟값 알고리즘을 그대로 사용합니다. 정리하면 근삿값 알고리즘은 ‘차이 값의 절댓값 중 최솟값’을 구하는 알고리즘입니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.