[C언어] 배열의 두 번째로 작은 요소를 찾는 3가지 방법

ET의 공부/C언어|2020. 4. 5. 21:56

오늘의 주제는 배열에서 두 번째로 작은 요소를 찾는 3가지 방법에 대해 포스팅해보겠습니다.

 

배열에서 두 번째로 작은 요소를 찾는 3가지 방법은 다음과 같습니다.

 

-1. 오름차순으로 정렬된 배열의 두 번째 요소 확인

-2. 배열을 두 번 순회하여 처음엔 가장 작은, 두 번째 순회에 두 번째로 작은 요소 확인

-3. 2개의 변수로 배열을 순회

 

 

1. 배열의 두 번째로 작은 값 찾기 1

 

배열의 두 번째로 작은 값을 찾는 첫 번째 방법은 오름차순으로 정렬된 배열의 두 번째 요소를 확인하는 것입니다.

 

1. 입력받은 배열을 오름차순 정렬.

2. Arr[1]의 요소에 접근( 배열은 0부터 시작 )

 

순으로 동작하게 됩니다. 

 

 

코드:

//두 번째로 작은 배열 값 찾기.1
#include<stdio.h>
 
 
#define ArrLEN 7
int main()
{
 
    int arr[ArrLEN] = {4,9,3,2,11,5,7};
    printf("\n 정렬 되지 않은 배열 : ");
    for(int i = 0; i < ArrLEN; i++)
    {
        printf("%d ",arr[i]);
    }
    //오름차순 정렬
    for (int i = 0; i < ArrLEN-1; i++)
    {
        for (int j = 0; j < ArrLEN-i-1; j++)
        {
            if (arr[j] > arr[j+1])
            {
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1= temp;
            }
        }
    }
    printf("\n 정렬 된 배열 : ");
    for(int i = 0; i < ArrLEN; i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n 두 번째로 작은 배열 값: %d \n",arr[1]);
    return 0;
}
 
 

 

 

2. 배열의 두 번째로 작은 값 찾기 2

 

 

배열의 두 번째로 작은 값을 찾는 두 번째 방법은 배열을 두 번 순회하여 처음엔 가장 작은, 두 번째 순회에 두 번째로 작은 요소 확인하는 것입니다.

 

1. 첫 번째 순환(for문)에서 가장 작은 배열 값 확인

2. 1. 번을 제외한 가장 작은 배열 값 확인

 

 
//두 번째로 작은 배열 값 찾기.2
#include<stdio.h>
#include <limits.h>
 
#define ArrLEN 7
int main()
{
 
    int arr[ArrLEN] = {4,9,3,2,11,5,7};
    printf("\n 배열 : ");
    for(int i = 0; i < ArrLEN; i++)
    {
        printf("%d ",arr[i]);
    }
    //순환
    int min = INT_MAX;
    int second_min = INT_MAX ;
    
    
    for(int i = 0; i < ArrLEN; i++)
    {
        if(arr[i] < min)
        {
            second_min = min;
            min = arr[i];
        }
    }
    printf("\n 첫 번째로 작은 배열 값: %d \n",min);
    
    for(int i = 0; i < ArrLEN; i++)
    {
        if(arr[i] < second_min && arr[i] != min)
        {
            second_min = arr[i];
        }
    }
    printf("두 번째로 작은 배열 값: %d \n",second_min);
    
    return 0;
}
 
 

 

첫 번째 반복문으로 가장 작은 배열 값을 찾습니다.

 

  for(int i = 0; i < ArrLEN; i++)

    {

        if(arr[i] < min)

        {

            second_min = min;

            min = arr[i];

        }

    }

 

min과 second_min 은 int형의 MAX 값으로 초기화되어 있습니다.

arr[i] < min 일 경우 min의 값은 arr[i]로 업데이트되며 이전 min 값은 second_min이 갖게 됩니다.

 

제가 예로 든 int arr[ArrLEN] = {4,9,3,2,11,5,7};의 경우 second_min이 바로 두 번째로 작은 값을 갖게 되지만 만약

배열의 첫 번째 요소가 가장 작은 값이라면 second_min은 업데이트되지 못하고 가장 작은 값만 갖게 됩니다.

 

그러므로 두 번째 반복문에서 두 번째로 작은 값을 찾게 됩니다.

 

    for(int i = 0; i < ArrLEN; i++)

    {

        if(arr[i] < second_min && arr[i] != min)

        {

            second_min = arr[i];

        }

    }

 

arr[i] < second_min : 마찬가지로 second_min 보다 작은 값을 찾는데 여기에 and 연산으로 (&& arr[i] != min) 가장 작은 값과 같지 않은 값을 찾아 줍니다.

 

 

 

3. 배열의 두 번째로 작은 값 찾기 3

 

세 번째 방법은 두 번째 방법의 반복문을 하나로 합친 것입니다.

if, else 문을 사용하여 두 반복문을 하나로 합쳐줍니다.

 

//두 번째로 작은 배열 값 찾기.3
#include<stdio.h>
#include <limits.h>
 
#define ArrLEN 7
int main()
{
    
    int arr[ArrLEN] = {4,9,3,2,11,5,7};
    
    printf("\n 배열 : ");
    for(int i = 0; i < ArrLEN; i++)
    {
        printf("%d ",arr[i]);
    }
    //순환
    int min = INT_MAX;
    int second_min = INT_MAX ;
    
    
    for(int i = 0; i < ArrLEN; i++)
    {
        if(arr[i] < min)
        {
            second_min = min;
            min = arr[i];
        }
        else if(arr[i] < second_min && arr[i] != min)
        {
            second_min = arr[i];
        }
    }
    printf("\n 첫 번째로 작은 배열 값: %d \n",min);
    
 
    printf(" 두 번째로 작은 배열 값: %d \n",second_min);
    
    return 0;
}
 

 

 

감사합니다.

댓글()