소개

방정식은 수학의 기본입니다. 물리학을 계산하든, 알고리즘을 다루든, 아니면 그냥 연습을 하든, 코드를 사용하여 방정식을 푸는 방법을 아는 것은 정말 유용합니다. 네 가지 경우를 살펴보겠습니다:

  1. 선형 방정식 (ax + b = 0)
  2. 이차 방정식 (ax² + bx + c = 0)
  3. 두 개의 선형 방정식 시스템 (두 개의 미지수)
  4. 삼차 방정식 (ax³ + bx² + cx + d = 0)

각 경우마다 수학적 논리부터 시작한 후, C++와 Python 코드를 살펴보겠습니다.

1. 선형 방정식 (ax + b = 0)

해결 방법 (수학):

  • b를 다른 쪽으로 이동: ax = -b.
  • a = 0이고 b = 0이면 → 무한히 많은 해.
  • a = 0이고 b ≠ 0이면 → 해가 없음.
  • 그렇지 않으면, x = -b/a.

C++:

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    double a, b;
    cin >> a >> b;

    if (fabs(a) < 1e-9) {
        if (fabs(b) < 1e-9) cout << "무한한 해\n";
        else cout << "해가 없음\n";
    } else {
        cout << "x = " << -b/a << endl;
    }
    return 0;
}

Python:

a, b = map(float, input("a와 b를 입력하세요: ").split())

if abs(a) < 1e-9:
    if abs(b) < 1e-9:
        print("무한한 해")
    else:
        print("해가 없음")
else:
    print("x =", -b/a)

2. 이차 방정식 (ax² + bx + c = 0)

해결 방법 (수학):

  • 판별식 계산: Δ = b² − 4ac.
  • Δ < 0이면: 실해가 없음.
  • Δ = 0이면: 중복근 x = −b/(2a).
  • Δ > 0이면: 이차 공식으로 두 개의 근 x₁, x₂.
  • a = 0이면: 선형으로 줄이기.

C++:

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    double a, b, c;
    cin >> a >> b >> c;

    if (fabs(a) < 1e-9) {
        cout << "x = " << -c/b << "\n";
    } else {
        double delta = b*b - 4*a*c;
        if (delta < 0) cout << "실근이 없음\n";
        else if (fabs(delta) < 1e-9) cout << "중복근 x = " << -b/(2*a) << "\n";
        else {
            cout << "x1 = " << (-b + sqrt(delta))/(2*a) << "\n";
            cout << "x2 = " << (-b - sqrt(delta))/(2*a) << "\n";
        }
    }
}

Python:

import math

a, b, c = map(float, input("a, b, c를 입력하세요: ").split())
if abs(a) < 1e-9:
    print("x =", -c/b)
else:
    delta = b*b - 4*a*c
    if delta < 0:
        print("실근이 없음")
    elif abs(delta) < 1e-9:
        print("중복근 x =", -b/(2*a))
    else:
        x1 = (-b + math.sqrt(delta))/(2*a)
        x2 = (-b - math.sqrt(delta))/(2*a)
        print("x1 =", x1, "x2 =", x2)

3. 두 개의 선형 방정식 시스템

형식:

ax + by = c
dx + ey = f

해결 방법 (수학):

  • 크래머의 법칙을 사용하세요.
  • 행렬식: D = ae - bd.
  • D ≠ 0이면: x = (ce - bf) / D y = (af - cd) / D
    • x = (ce - bf) / D
    • y = (af - cd) / D
  • D = 0이면: Dx = 0이고 Dy = 0이면 → 무한히 많은 해. 그렇지 않으면 → 해가 없음.
    • Dx = 0이고 Dy = 0이면 → 무한히 많은 해.
    • 그렇지 않으면 → 해가 없음.

C++:

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    double a,b,c,d,e,f;
    cin >> a >> b >> c >> d >> e >> f;

    double D  = a*e - b*d;
    double Dx = c*e - b*f;
    double Dy = a*f - c*d;

    if (fabs(D) < 1e-9) {
        if (fabs(Dx) < 1e-9 && fabs(Dy) < 1e-9) cout << "무한한 해\n";
        else cout << "해가 없음\n";
    } else {
        cout << "x = " << Dx/D << ", y = " << Dy/D << "\n";
    }
}

Python:

a, b, c, d, e, f = map(float, input("a,b,c,d,e,f를 입력하세요: ").split())

D  = a*e - b*d
Dx = c*e - b*f
Dy = a*f - c*d

if abs(D) < 1e-9:
    if abs(Dx) < 1e-9 and abs(Dy) < 1e-9:
        print("무한한 해")
    else:
        print("해가 없음")
else:
    x = Dx / D
    y = Dy / D
    print("x =", x, "y =", y)

4. 삼차 방정식 (ax³ + bx² + cx + d = 0)

해결 방법 (수학):

  • 일반적인 방법: 카르다노의 공식을 사용하세요.
  • x² 항을 제거하기 위해 대체: x = t - b/(3a)로 설정하세요.
  • 축소된 형태: t³ + pt + q = 0.
  • 판별식: Δ = (q/2)² + (p/3)³. Δ > 0이면: 1개의 실근, 2개의 복소근. Δ = 0이면: 최소 2개의 같은 실근. Δ < 0이면: 3개의 서로 다른 실근.
    • Δ > 0이면: 1개의 실근, 2개의 복소근.
    • Δ = 0이면: 최소 2개의 같은 실근.
    • Δ < 0이면: 3개의 서로 다른 실근.
  • 솔직히, C++에서 카르다노의 공식을 코딩하는 것은 좀 힘듭니다. Python에서는 그냥 NumPy를 사용할 수 있습니다.

C++ (하나의 실근을 위한 간소화):

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    double a,b,c,d;
    cin >> a >> b >> c >> d;

    double f = ((3*c/a) - (b*b)/(a*a)) / 3;
    double g = ((2*b*b*b)/(a*a*a) - (9*b*c)/(a*a) + (27*d/a)) / 27;
    double h = g*g/4 + f*f*f/27;

    if (h > 0) {
        double R = -(g/2) + sqrt(h);
        double S = cbrt(R);
        double T = -(g/2) - sqrt(h);
        double U = cbrt(T);
        double x1 = (S+U) - (b/(3*a));
        cout << "하나의 실근 x = " << x1 << "\n";
    } else {
        cout << "여러 개의 실근 (전체 카르다노 필요)\n";
    }
}

Python (NumPy):

import numpy as np

coeffs = list(map(float, input("a, b, c, d를 입력하세요: ").split()))
roots = np.roots(coeffs)
print("근:", roots)

결론

우리는 선형, 이차, 2×2 시스템 및 삼차 방정식을 해결하는 수학과 코드를 다루었습니다. C++는 수식을 직접 구성하고, Python은 간결하게 유지합니다 (그리고 NumPy는 삼차 근을 쉽게 찾습니다). 각 해결기를 직접 구현해 보면서 대수와 프로그래밍 기술을 모두 키워보세요.