본문 바로가기

Lang

[Python]방정식 문제를 코딩으로 풀어보기

아이랑 같이 수학 문제 풀어보다가 프로그램으로 한 번 짜보면 어떨까 생각하고 도전.

문제는 대충 이렇다.

33개의 공이 일렬로 놓여있다.
모든 공의 값의 합은 6,500원.
왼쪽 첫 공부터 가운데 공까지의 각각의 공값은 10원 씩 비싸진다.
오른쪽 첫 공부터 가운데 공까지의 각각의 공값은 15원 씩 비싸진다.

가운데 공의 값을 구하시오.

공식 만드는거는 그리 어려울 것 없다. 

중앙의 위치값은 17이므로 좌측 첫 공의 값을 x, 우측 첫 공의 값을 y 라 할 때,

  • x + 10 * 16 = y + 15 * 16
  • 6500 = 왼쪽부터 16번째까지의 합 + 오른쪽부터 16번째까지의 합 + 중앙값(= x + 10 * 16) 

호기롭게 컴 앞에 앉았는데 방정식을 코딩하려니 시작부터 벽. 
다행히 sympy 란 걸 이용하는 방법을 검색으로 쉽게 찾을 수 있었다. 

별건 아니었지만 방정식 문제는 sympy 이용하면 된다는거 배운 기념으로 코딩한거 옮겨 적어본다.

from sympy import Symbol, solve
import unittest


def get_side_total(sym_val, inc_val):
    inc_total = (mid_idx * (mid_idx - 1) * inc_val) // 2
    return sym_val * mid_idx + inc_total


def get_mid_val():
    x_mid = x + (x_inc * mid_idx)
    equation1 = x_mid - (y + (y_inc * mid_idx))
    x_sum = get_side_total(x, x_inc)
    y_sum = get_side_total(y, y_inc)
    print(x_sum, y_sum)
    equation2 = total - (x_sum + y_sum + x_mid)
    return solve((equation1, equation2))


def main():
    result = get_mid_val()
    print("center ball :", result[x] + (x_inc * mid_idx))

    test = TestQuiz()
    test.test_sum(result)


class TestQuiz(unittest.TestCase):
    def test_sum(self, result):
        calc_tot = 0
        for n in range(1, balls + 1):
            if n <= 17:
                calc_tot += result[x] + (x_inc * (n - 1))
            else:
                calc_tot += result[y] + (y_inc * (balls - n))
        self.assertEqual(calc_tot, total)


if __name__ == '__main__':
    x_inc = 10
    y_inc = 15
    balls = 33
    total = 6500
    mid_idx = balls // 2
    x = Symbol('x')
    y = Symbol('y')

    main()

맞게 푼건지 검증은 않았는데 아이 푼 답하고 비교해보면 되겠지 ㅎ