일차원 배열을 다루는 기본 연산 중에서 데이터 순회(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()는 원본 배열 자체를 변경한다는 점에 유의해야 합니다. 만약 원본 배열을 보존해야 한다면 정렬 전에 배열을 복사하여 사용하는 것이 바람직합니다.