잠토의 잠망경

[알고리즘] 최대값/최소값 찾기 in 정렬된상태 본문

공부/알고리즘

[알고리즘] 최대값/최소값 찾기 in 정렬된상태

잠수함토끼 2021. 5. 30. 23:06

최대값/최소값은 간단하다.

기본틀은 분할 정복을 기반으로 하며 간단하게 구현된다.

. 오름차순 : 최대값 (오른쪽으로 이동한다. 커지는 방향이다. 멈춘곳이 최대이다.)

. 내림차순 : 최소값 (왼쪽으로 이동한다. 작아지는 방향이다. 멈추면 최소인위치이다.)

최대값 찾기

정렬된 주어진


#include<stdio.h>

int buffer[] = { 1, 3, 5, 7, 9, 11 };

int getMax(int target)
{
    int keep = 0;

    int s = 0;
    int e = 5;

    int m = (s + e) / 2;

    while (s <= e)
    {
        if (buffer[m] <= target) // 요기
        {
            s = m + 1;
            keep = m;   // 요기가 주요하다.
        }
        else
        {
            e = m - 1;
        }

        m = (s + e) / 2;
    }

    return keep;
}


int main(void)
{

    printf("1 == %d\n", buffer[getMax(2)]);
    printf("3 == %d\n", buffer[getMax(4)]);
    printf("5 == %d\n", buffer[getMax(6)]);
    printf("7 == %d\n", buffer[getMax(8)]);
    printf("9 == %d\n", buffer[getMax(10)]);


    return 0;
}

최소값 찾기

#include<stdio.h>


int buffer[] = { 1, 3, 5, 7, 9, 11 };



int getMax(int target)
{
    int keep = 0;

    int s = 0;
    int e = 5;

    int m = (s + e) / 2;

    while (s <= e)
    {
        if (buffer[m] <= target)
        {
            s = m + 1;
            keep = m;
        }
        else
        {
            e = m - 1;
        }

        m = (s + e) / 2;
    }

    return keep;
}

int getMin(int target)
{
    int keep = 0;

    int s = 0;
    int e = 5;

    int m = (s + e) / 2;

    while (s <= e)
    {
        if (buffer[m] < target) // 요기 핵심
        {
            s = m + 1;
        }
        else
        {
            e = m - 1;
            keep = m;  // 요기 핵심
        }

        m = (s + e) / 2;
    }

    return keep;
}



int main(void)
{

    printf("3 == %d\n", buffer[getMin(2)]);
    printf("5 == %d\n", buffer[getMin(4)]);
    printf("7 == %d\n", buffer[getMin(6)]);
    printf("9 == %d\n", buffer[getMin(8)]);
    printf("11 == %d\n", buffer[getMin(10)]);


    return 0;
}
Comments