C# 코딩테스트 강좌, 최소 공배수 구하기

이번 강좌에서는 코딩 테스트에서 자주 출제되는 “최소 공배수(Lowest Common Multiple, LCM)” 문제를 해결하는 방법에 대해 알아보겠습니다. 최소 공배수는 두 개 이상의 수들에서 공통적으로 나누어 떨어지는 가장 작은 양의 정수를 의미합니다. 이 개념은 수학적으로 중요한 성질을 가지며, 알고리즘적 문제 해결에서도 자주 사용됩니다.

문제 설명

주어진 두 양의 정수 A와 B에 대해, A와 B의 최소 공배수를 구하는 프로그램을 작성하시오.

예제:
A = 12, B = 15
출력: 60 (12와 15의 최소 공배수)

문제 해결 과정

문제를 해결하기 위해서는 최소 공배수를 구하는 방법을 이해해야 합니다. 일반적으로 최소 공배수는 최대 공약수(Greatest Common Divisor, GCD)를 이용하여 구할 수 있습니다. 두 수 A와 B의 최소 공배수는 다음과 같이 표현됩니다:

LCM(A, B) = (A * B) / GCD(A, B)

이를 통해 최소 공배수를 구하기 위해서는 두 수의 곱을 최대 공약수로 나누어 주면 됩니다. 이제 C#으로 이 알고리즘을 구현해 보겠습니다.

최대 공약수 구하기

최대 공약수는 유클리드 호제법을 사용하여 쉽게 구할 수 있습니다. 유클리드 호제법의 기본 원리는 다음과 같습니다:

GCD(A, B) = GCD(B, A % B) (B가 0이 될 때까지 반복)

이제 이를 C#으로 구현해 보겠습니다.

C# 코드 구현


using System;

class Program
{
    // 최대 공약수를 구하는 메서드
    static int GCD(int a, int b)
    {
        while (b != 0)
        {
            int temp = b;
            b = a % b;
            a = temp;
        }
        return a;
    }

    // 최소 공배수를 구하는 메서드
    static int LCM(int a, int b)
    {
        return (a * b) / GCD(a, b);
    }

    static void Main(string[] args)
    {
        Console.Write("첫 번째 정수를 입력하세요: ");
        int a = int.Parse(Console.ReadLine());
        
        Console.Write("두 번째 정수를 입력하세요: ");
        int b = int.Parse(Console.ReadLine());

        Console.WriteLine($"최소 공배수는: {LCM(a, b)}입니다.");
    }
}
    

위 코드는 사용자가 입력한 두 정수의 최소 공배수를 계산하여 출력합니다. GCD 메서드는 최대 공약수를 계산하고, LCM 메서드는 최소 공배수를 계산하는 역할을 수행합니다.

코드 설명

1. 최대 공약수 메서드

GCD(int a, int b) 메서드는 두 정수 a와 b를 인자로 받아 최대 공약수를 반환합니다. while 루프를 이용해 b가 0이 아닐 때까지 반복하며, a와 b의 값을 업데이트합니다. 이를 통해 유클리드 호제법을 구현하였습니다.

2. 최소 공배수 메서드

LCM(int a, int b) 메서드는 최소 공배수를 구하기 위해 두 수의 곱을 최대 공약수로 나누고 결과를 반환합니다. 이 과정에서 정수 오버플로우를 방지하기 위해 순서를 잘 고려해야 합니다.

3. Main 메서드

Main 메서드에서는 사용자로부터 두 개의 정수를 입력받고, 이를 이용하여 LCM 메서드를 통해 결과를 출력합니다. Console.ReadLine()을 통해 입력값을 받고, int.Parse()로 정수형으로 변환합니다.

테스트와 예외 처리

이번 강좌에서 구현한 최소 공배수 프로그램은 간단하지만, 몇 가지 예외 상황을 고려해야 할 필요가 있습니다. 예를 들어 사용자가 0이나 음의 정수를 입력하는 경우, 이러한 입력을 처리할 수 있는 방법을 고려해야 합니다. 이를 위해 다음과 같은 예외 처리를 추가할 수 있습니다:


static void Main(string[] args)
{
    try
    {
        Console.Write("첫 번째 정수를 입력하세요: ");
        int a = int.Parse(Console.ReadLine());
        if (a <= 0) throw new ArgumentException("양의 정수를 입력해야 합니다.");

        Console.Write("두 번째 정수를 입력하세요: ");
        int b = int.Parse(Console.ReadLine());
        if (b <= 0) throw new ArgumentException("양의 정수를 입력해야 합니다.");

        Console.WriteLine($"최소 공배수는: {LCM(a, b)}입니다.");
    }
    catch (FormatException)
    {
        Console.WriteLine("잘못된 입력입니다. 정수를 입력해 주세요.");
    }
    catch (ArgumentException ex)
    {
        Console.WriteLine(ex.Message);
    }
    catch (Exception ex)
    {
        Console.WriteLine("알 수 없는 오류가 발생했습니다: " + ex.Message);
    }
}
    

위의 코드에서 try-catch 블록을 사용하여 다양한 예외를 처리하고 있습니다. 사용자가 유효하지 않은 값을 입력했을 경우, 적절한 오류 메시지를 출력하여 프로그램이 비정상 종료되는 것을 방지할 수 있습니다.

효율성 및 최적화

이번 문제 해결 과정에서 사용된 유클리드 호제법은 최대 공약수를 매우 효율적으로 계산할 수 있도록 설계되어 있습니다. 이러한 알고리즘은 O(log(min(A, B))) 시간 복잡도를 갖기 때문에, 매우 큰 수의 최소 공배수를 구할 때에도 효율적으로 작동합니다. 이 점에서, 알고리즘의 성능은 매우 중요한 요소입니다.

마무리

이번 강좌에서는 C#을 사용하여 최소 공배수를 구하는 알고리즘을 구현해 보았습니다. 각 메서드의 기능을 이해하고, 예외 처리와 효율성에 대한 내용을 함께 다루어 보았습니다. 최소 공배수는 다양한 문제에서 응용되므로, 이 알고리즘을 잘 숙지해 두는 것이 중요합니다. 앞으로도 다양한 알고리즘 문제를 풀어보며 실력을 쌓아가시길 바랍니다!

여기까지 읽어주셔서 감사합니다. 다음 강좌에서는 다른 알고리즘 문제 해결 방법에 대해 알아보도록 하겠습니다.