C# 코딩테스트 강좌, Ax + By = C

코딩 테스트는 프로그래머가 자신의 기술을 평가받고, 기업에 적합한 인재를 찾기 위해 이루어지는 경쟁입니다. 오늘은 코딩 테스트에서 자주 등장하는 주제인 수식 문제를 풀어보려고 합니다. 특히, ‘Ax + By = C’ 형태의 방정식을 다루는 문제를 C#를 사용하여 어떻게 해결할 수 있는지에 대해 상세히 살펴보겠습니다.

문제 설명

주어진 정수 A, B, C가 있을 때, 방정식 Ax + By = C를 만족하는 (x, y)의 정수 해를 찾는 프로그램을 작성하시오. 해가 있을 경우, 모든 해를 출력해야 하며, 해가 없거나 무한 개일 경우 해당 메시지를 출력합니다.

입력 형식

  • 하나의 줄에 정수 A, B, C가 주어진다. (−109 ≤ A, B, C ≤ 109)

출력 형식

  • 해가 없으면 “해가 없습니다.”라고 출력한다.
  • 무한 개의 해가 존재하면 “무한 개의 해가 존재합니다.”라고 출력한다.
  • 해가 유한 개일 경우, 모든 해를 출력해야 한다.

문제 풀이 계획

문제를 해결하기 위한 기본 아이디어는 다음과 같습니다:

  1. A와 B가 모두 0인 경우:
    • 만약 C도 0이라면, 방정식은 항상 참이므로 무한히 많은 해가 존재합니다.
    • C가 0이 아닐 경우, 해가 존재하지 않습니다.
  2. A가 0인 경우:
    • 이 경우 방정식은 By = C가 됩니다. B가 0이라면, C가 0일 때만 해가 존재합니다. 그렇지 않으면 해가 없습니다.
    • B가 0이 아닐 경우, y = C/B의 해가 존재하고, x는 임의로 선택할 수 있으므로 무한 개의 해가 존재합니다.
  3. B가 0인 경우:
    • 이 경우 방정식은 Ax = C가 됩니다. A가 0이라면, C가 0일 때만 해가 존재합니다. 그렇지 않으면 해가 없습니다.
    • A가 0이 아닐 경우, x = C/A의 해가 존재하고, y는 임의로 선택할 수 있으므로 무한 개의 해가 존재합니다.
  4. A와 B가 모두 0이 아닌 경우:
    • 정수 x를 임의로 선택할 경우 y는 (C – Ax) / B가 됩니다.
    • 이를 통해 y가 정수인지 확인하려면 C – Ax가 B로 나누어 떨어져야 합니다. 이 때의 x 값에 대한 y 값을 찾아 출력합니다.

C# 코드 구현


using System;

class Program
{
    static void Main()
    {
        string[] input = Console.ReadLine().Split(' ');
        int A = int.Parse(input[0]);
        int B = int.Parse(input[1]);
        int C = int.Parse(input[2]);

        if (A == 0 && B == 0)
        {
            if (C == 0)
                Console.WriteLine("무한 개의 해가 존재합니다.");
            else
                Console.WriteLine("해가 없습니다.");
        }
        else if (A == 0)
        {
            if (B == 0)
            {
                if (C == 0)
                    Console.WriteLine("무한 개의 해가 존재합니다.");
                else
                    Console.WriteLine("해가 없습니다.");
            }
            else
            {
                Console.WriteLine($"y = {C / B}, x는 임의로 선택 가능.");
            }
        }
        else if (B == 0)
        {
            if (A == 0)
            {
                if (C == 0)
                    Console.WriteLine("무한 개의 해가 존재합니다.");
                else
                    Console.WriteLine("해가 없습니다.");
            }
            else
            {
                Console.WriteLine($"x = {C / A}, y는 임의로 선택 가능.");
            }
        }
        else
        {
            for (int x = -100; x <= 100; x++)
            {
                if ((C - A * x) % B == 0)
                {
                    int y = (C - A * x) / B;
                    Console.WriteLine($"x = {x}, y = {y}");
                }
            }
        }
    }
}

코드 설명

위 코드는 주어진 A, B, C의 값에 따라 다양한 경우를 체크하여 솔루션을 도출하는 방식으로 구현되어 있습니다. 각 경우에 따라 해가 존재하는지, 그리고 해의 개수가 무한인지, 아니면 유한한지를 체크합니다.

특히, (A가 0이 아닐 경우) 특정 범위에 대해 x 값을 반복하여 조건을 만족하는 y 값을 찾아 출력합니다. 여기서는 x 값의 범위를 -100부터 100까지로 제한했지만, 실제로는 더 넓은 범위를 고려할 수도 있습니다. 그러나 무한 개의 해가 존재하는 경우, 특정 범위에 대해 x와 y 값을 출력할 수 있습니다.

결론

이 문제를 통해 방정식의 해를 찾기 위해 여러 경우를 고려해야 함을 알 수 있습니다. 기본적인 수학 원리와 C# 코딩을 통해 모듈화된 문제 해결 방식을 살펴보았습니다. 향후 코딩 테스트에서 비슷한 문제를 encounter할 때, 이러한 접근 방식을 참조하면 좋을 것입니다.

마지막으로, 다양한 테스트 케이스로 본 코드를 검증하고, 결과에 따라 같은 알고리즘으로 다양한 문제들을 풀어낼 수 있는 확장성을 생각해보세요. 알고리즘 연습은 결코 쉬운 일이 아니지만, 끈기와 꾸준함이 필요하다는 점 잊지 마세요!