서론
코딩 테스트에서 자주 출제되는 알고리즘 중 하나인 유클리드 호제법(Euclidean Algorithm)은 두 수의 최대공약수(GCD)를 효율적으로 구하는 방법입니다.
이 방법은 고대 그리스 수학자 유클리드가 소개했으며, 알고리즘의 기초에 해당하는 내용이기 때문에 프로그래밍 언어와 관계없이 알아두어야 할 필수 개념입니다.
본 강좌에서는 C#을 이용하여 유클리드 호제법을 구현하는 방법을 배워보겠습니다.
문제 설명
주어진 두 정수 a와 b에 대해, 두 수의 최대공약수(GCD)를 구하는 문제입니다.
GCD는 두 정수가 공통으로 가지는 최대의 양의 약수입니다.
예를 들어, a = 48, b = 18일 때, GCD(48, 18) = 6이 됩니다.
입력 형식
첫 번째 줄에 정수 a와 b가 공백으로 구분되어 주어진다 (1 ≤ a, b ≤ 10^9).
출력 형식
두 수 a와 b의 최대공약수(GCD)를 출력한다.
유클리드 호제법 이해하기
유클리드 호제법은 다음과 같은 원리를 기반으로 합니다:
1. 두 수 a와 b가 주어질 때, a를 b로 나눈 나머지를 r이라고 할 때, GCD(a, b) = GCD(b, r) 입니다.
2. 이 과정을 반복하여 b가 0이 될 때, a가 GCD가 됩니다.
이러한 방법은 매우 효율적이며, 특히 a와 b이 큰 경우에도 빠르게 계산할 수 있습니다.
이러한 특성 덕분에 유클리드 호제법은 많은 알고리즘 문제에서 유용하게 사용됩니다.
C#으로 유클리드 호제법 구현하기
이제 C#을 이용해 유클리드 호제법을 구현해 보겠습니다. 아래는 해당 알고리즘을 구현한 코드입니다.
using System;
class Program
{
static void Main(string[] args)
{
// 입력값 받기
string[] inputs = Console.ReadLine().Split(' ');
int a = int.Parse(inputs[0]);
int b = int.Parse(inputs[1]);
// 최대공약수 계산
int gcd = EuclideanGCD(a, b);
Console.WriteLine(gcd);
}
static int EuclideanGCD(int a, int b)
{
while (b != 0)
{
int temp = b;
b = a % b; // 나머지를 구함
a = temp; // b의 값을 a에 대입
}
return a; // GCD를 반환
}
}
코드 설명
위 코드는 두 정수를 입력받아 유클리드 호제법을 이용하여 최대공약수를 계산합니다.
Main
메서드에서는 사용자로부터 두 수를 입력받고, EuclideanGCD
메서드를 호출하여 GCD를 계산합니다.
EuclideanGCD
메서드는 while 루프를 사용하여 b가 0이 될 때까지 반복하며, GCD를 계산합니다.
시간 복잡도 및 공간 복잡도
유클리드 호제법의 시간 복잡도는 O(log(min(a, b)))입니다. 이는 두 수의 크기가 지수적으로 줄어들기 때문입니다.
공간 복잡도는 O(1)로, 추가적인 자료구조를 사용하지 않으므로 매우 효율적입니다.
테스트 케이스
알고리즘의 정확성을 검증하기 위해 다음과 같은 테스트 케이스를 사용해 볼 수 있습니다.
// 테스트 케이스
48 18 // 예상 출력: 6
56 98 // 예상 출력: 14
101 103 // 예상 출력: 1
1000000000 500000000 // 예상 출력: 500000000
결론
유클리드 호제법은 최대공약수를 구하는 매우 효율적인 알고리즘입니다.
이번 글을 통해 C#을 사용하여 유클리드 호제법을 어떻게 구현할 수 있는지 살펴보았습니다.
코딩 테스트에서 이러한 알고리즘 문제를 자주 만나게 될 것이므로, 이해하고 연습하는 것이 중요합니다.
앞으로 다양한 알고리즘에 대한 심도 있는 강좌를 진행할 예정이니, 많은 관심 부탁드립니다!