일차원 배열의 핵심 활용: 최댓값, 최솟값 탐색 및 정렬 기법

일차원 배열을 다루는 기본 연산 중에서 데이터 순회(traversal) 외에 가장 흔히 사용되는 것은 최댓값과 최솟값을 찾는 작업입니다. 이 과정은 흔히 '가정법(hypothetical method)'이라고 불리는 논리적 접근 방식을 사용합니다.

최댓값 찾기: 가정법과 반복문을 활용한 접근

최댓값을 구하는 방법은 마치 시합에서 첫 번째 선수를 '임시 챔피언'으로 가정하고, 이후의 모든 도전자와 비교하여 더 강한 선수가 나타나면 교체하는 방식과 유사합니다. 즉, 배열의 첫 번째 요소를 임시 최댓값 변수(max)에 저장한 후, 나머지 요소들을 하나씩 max와 비교합니다. 비교 대상 요소가 max보다 크면 max 값을 해당 요소로 갱신합니다. 이 과정을 배열의 끝까지 반복하면 최종적으로 max에는 배열 내에서 가장 큰 값이 저장됩니다. 이는 모든 요소를 한 번씩만 확인하면 되므로 효율적입니다.

실습 예제: 5명의 학생 점수 중 최고점 찾기

다음은 Console을 통해 5개의 점수를 입력받아 최고점을 출력하는 C# 코드입니다.

using System;

class Program
{
    static void Main()
    {
        // 1. 배열 및 변수 선언
        int[] scores = new int[5];
        int maxScore;

        // 2. 사용자로부터 점수 입력 받기
        Console.WriteLine("5명의 학생 점수를 입력하세요:");
        for (int index = 0; index < scores.Length; index++)
        {
            scores[index] = int.Parse(Console.ReadLine());
        }

        // 3. 최댓값 탐색 (가정법 사용)
        // 첫 번째 요소를 최댓값으로 가정
        maxScore = scores[0];

        // 두 번째 요소부터 배열 끝까지 비교
        for (int index = 1; index < scores.Length; index++)
        {
            if (scores[index] > maxScore)
            {
                maxScore = scores[index];
            }
        }

        // 4. 결과 출력
        Console.WriteLine("최고 점수: " + maxScore);
    }
}

코드를 실행하고 점수(예: 87, 90, 56, 77, 68)를 순서대로 입력하면 최고점수로 90이 출력됩니다.

최솟값 찾기: 동일한 패턴, 반대 조건

최솟값을 찾는 과정은 최댓값 찾기와 논리적으로 동일하지만, 비교 조건만 반대로 설정하면 됩니다. 첫 번째 요소를 임시 최솟값 변수(min)에 저장한 후, 나머지 요소들과 비교하여 더 작은 값을 발견할 때마다 min을 갱신합니다. 다음 코드는 앞선 예제에 최솟값 탐색 로직을 추가한 모습입니다.

using System;

class Program
{
    static void Main()
    {
        int[] scores = new int[5];
        int maxScore, minScore;

        Console.WriteLine("5명의 학생 점수를 입력하세요:");
        for (int index = 0; index < scores.Length; index++)
        {
            scores[index] = int.Parse(Console.ReadLine());
        }

        // 첫 번째 요소로 최댓값과 최솟값 초기화
        maxScore = scores[0];
        minScore = scores[0];

        // 두 번째 요소부터 순회하며 최댓값, 최솟값 갱신
        for (int index = 1; index < scores.Length; index++)
        {
            if (scores[index] > maxScore)
            {
                maxScore = scores[index];
            }
            if (scores[index] < minScore)
            {
                minScore = scores[index];
            }
        }

        Console.WriteLine("최고 점수: " + maxScore);
        Console.WriteLine("최저 점수: " + minScore);
    }
}

점수 78, 65, 90, 56, 88을 입력하면 최고점수 90, 최저점수 56이 올바르게 출력됩니다.

배열 정렬: Array.Sort()와 Array.Reverse()의 활용

데이터를 정렬하는 것은 매우 빈번한 요구사항입니다. 버블 정렬(Bubble Sort), 선택 정렬(Selection Sort) 등 다양한 알고리즘이 존재하지만, C#에서는 .NET Framework가 제공하는 강력한 정적 메서드를 통해 이를 손쉽게 처리할 수 있습니다.

1. 오름차순 정렬: Array.Sort() 메서드는 배열의 요소를 기본적으로 오름차순(작은 값에서 큰 값 순서)으로 정렬합니다.

2. 내림차순 정렬: 직접적인 내림차순 정렬 메서드는 없지만, Array.Sort()로 오름차순 정렬을 수행한 후 Array.Reverse() 메서드를 호출하여 배열의 요소 순서를 뒤집으면 내림차순 결과를 얻을 수 있습니다.

실습 예제: 점수 정렬 후 내림차순으로 출력

다음 코드는 5개의 점수를 입력받아 내림차순으로 정렬하여 출력합니다.

using System;

class Program
{
    static void Main()
    {
        int[] scores = new int[5];

        Console.WriteLine("5명의 학생 점수를 입력하세요:");
        for (int i = 0; i < scores.Length; i++)
        {
            scores[i] = int.Parse(Console.ReadLine());
        }

        // 1. 오름차순 정렬
        Array.Sort(scores);
        // 2. 배열 순서를 뒤집어 내림차순으로 변환
        Array.Reverse(scores);

        // 3. 결과 출력 (foreach 문 활용)
        Console.WriteLine("점수 (높은 순):");
        foreach (int score in scores)
        {
            Console.WriteLine(score);
        }
    }
}

점수 78, 56, 92, 87, 91을 입력하면 출력 결과는 92, 91, 87, 78, 56 순서로 나타납니다. 먼저 Array.Sort()가 배열을 [56, 78, 87, 91, 92]로 정렬하고, Array.Reverse()가 이를 뒤집어 [92, 91, 87, 78, 56]을 만듭니다.

Array.Sort()Array.Reverse()는 원본 배열 자체를 변경한다는 점에 유의해야 합니다. 만약 원본 배열을 보존해야 한다면 정렬 전에 배열을 복사하여 사용하는 것이 바람직합니다.

태그: Array.Sort Array.Reverse 일차원 배열 최댓값 최솟값

6월 7일 23:57에 게시됨