Debug & Think

[C#] 2차방정식 풀기: 근의 공식 활용 본문

카테고리 없음

[C#] 2차방정식 풀기: 근의 공식 활용

J.Note 2025. 6. 17. 00:24

최근 코딩 테스트 문제를 풀다가 학창 시절 배운 2차 방정식이 생각보다 실생활 문제 해결에도 쓰인다는 걸 깨달아 흥미로웠습니다. 이번 글에서는 그 경험과 함께 C#을 활용해 어떻게 접근했는지를 소개합니다.

 

📖 문제 상황 (창작 예시)

한 마을 축제에서 거대한 종이학이 날아올라 멋지게 펼쳐진 뒤 K개의 중간 종이학으로 나뉘고,
각 중간 종이학은 다시 K개의 작은 종이학으로 접혀 완성됩니다.
이후에는 더 이상 종이학이 생기지 않습니다.
이때 만들어진 모든 종이학의 수가 result라면, 과연 K는 몇일까?

 


 

🔍 수식으로 분석해보기

  • 큰 종이학: 1개
  • 중간 종이학: K개
  • 작은 종이학: K * K개
📐 전체 종이학 수:
result = 1 + K + K²

 

이 식을 정리하면 다음과 같은 2차 방정식이 됩니다:

K² + K + 1 = result
→ K² + K + (1 - result) = 0

 

 


💡 2차 방정식으로 K 구하기

이제 C#으로 result를 입력받고, 가능한 정수 해 K를 구하는 코드를 작성

1️⃣ 판별식 선언

//k² + k + (1 - result) = 0 형태
//⬇
//ak² + bk + c = 0

int a = 1;
int b = 1;
int c = 1 - result;

// discriminant 뜻 : 판별식
double discriminant = b * b - 4 * a * c; // discriminant는 (b² - 4ac)

2️⃣ 제곱근

double sqrtDiscriminant = Math.Sqrt(discriminant);
  • Math.Sqrt()
    → 제곱근(sqrt)을 구하는 함수
    ex) Math.Sqrt(9)3
    항상 double 타입의 실수 값을 반환
  • discriminant : 판별식
    → 이차방정식의 판별식. D = b² - 4ac
    D 값이
    • > 0보다 크면 실수 두 개     - 현재 필요한 값
    •  = 0이면 중근 (하나의 값)
    •  < 0
    보다 작으면 허근 (실수 해 없음)
  • sqrtDiscriminant
    →  판별식" b² - 4ac의 제곱근" 이라는 의미의 변수입니다.
          제곱근을 활용하는 이유는
    근의 공식  x = (-b ± √(b² - 4ac)) / 2a 에서 √(b² - 4ac)의 루트를 없애기 위해 필요
// 예제
int a = 1, b = 1, c = -20;
double discriminant = b * b - 4 * a * c; // 1*1 - 4*1*(-20) = 81
double sqrtDiscriminant = Math.Sqrt(discriminant); // sqrt(81) = 9

 


3️⃣ 정수 확인

if (sqrtDiscriminant % 1 != 0)

 

  • % 1소수점 이하 값만 남깁니다.
  • 이 식에서 원하는 건 정수 k입니다.
  • sqrtDiscriminant % 1 != 0은 "소수점 이하가 0이 아니라면 → 정수가 아니다"는 뜻이기에
    정수인지 확인합니다.

 

4️⃣ 근의 공식 활용

double k1 = (-b + sqrtDiscriminant) / (2 * a);
double k2 = (-b - sqrtDiscriminant) / (2 * a);
  • 표준적인 이차방정식 형태 ax² + bx + c = 0   에서 값을 구하려면
  • 근의 공식  x = (-b ± √(b² - 4ac)) / 2a  사용

 

📌 요약

double discriminant = b * b - 4 * a * c;
double sqrtDiscriminant = Math.Sqrt(discriminant);

double k1 = (-b + sqrtDiscriminant) / (2 * a);
double k2 = (-b - sqrtDiscriminant) / (2 * a);

 

  • 이차방정식의 해를 수학적으로 계산하는 공식을 통해 값을 구하고
    k1, k2 중에 정수인 값만 채택하여 k로 사용
 

 


 

수학 공식으로 표현해보면

🎯 목표 식:

1 + k(1 + k) = result

① 식 정리:

1 + k(1 + k) = result
=> 1 + k + k² = result
=> k² + k + 1 - result = 0

② 이차방정식 형태로 만들기:

k² + k + (1 - result) = 0
⬇
ak² + bk + c = 0

a = 1,  b = 1,  c = 1 - result

 

③ 근의 공식 사용:

x = (−b ± √(b² − 4ac)) / (2a)

④ 우리 식에 대입:

 
  

 


 
 


🧮 전체코드

 

using System;

class Program
{
    static void Main()
    {
        int result = 21; // 총 종이학 수 (예: 21)
        
        // k² + k + (1 - result) = 0 형태
        int a = 1;
        int b = 1;
        int c = 1 - result;
		
		// discriminant 뜻 : 판별식
		double discriminant = b * b - 4 * a * c; // discriminant는 (b² - 4ac)

        if (discriminant < 0) // 정수인지 아닌지 판별하는 코드
        {
            Console.WriteLine("실수 해가 없습니다.");
            return;
        }

        double sqrtDiscriminant = Math.Sqrt(discriminant); //  (b² - 4ac)의 제곱근. 루트풀기 위해

        if (sqrtDiscriminant % 1 != 0) // % 1는 소수점 이하 값만 남김
        {
            Console.WriteLine("정수 값이 없습니다.");
            return;
        }
		
        // 근의 공식 활용
        double k1 = (-b + sqrtDiscriminant) / (2 * a);
        double k2 = (-b - sqrtDiscriminant) / (2 * a);
        
        // 정수 값만 출력. % 1는 소수점 이하 값만 남김
        if (k1 % 1 == 0 && k1 >= 0)
            Console.WriteLine($"가능한 K 값: {k1}");
        if (k2 % 1 == 0 && k2 != k1 && k2 >= 0)
            Console.WriteLine($"가능한 K 값: {k2}");
    }
}