아이랑 같이 수학 문제 풀어보다가 프로그램으로 한 번 짜보면 어떨까 생각하고 도전.
문제는 대충 이렇다.
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()
맞게 푼건지 검증은 않았는데 아이 푼 답하고 비교해보면 되겠지 ㅎ
'Lang' 카테고리의 다른 글
[Python]두 DB 간 테이블 동기화 코딩 (0) | 2020.07.21 |
---|---|
[Java]여러 DB 환경에서 native query 쓸 때 orm.xml 문제 (0) | 2020.07.15 |
[Python] 야구 게임 - 숫자 맞추기 (0) | 2020.07.11 |
[Go Lang]1분 후 정각에 로직 수행 (0) | 2020.01.22 |
[js]배열에서 중복된 값 처리하는 몇 가지 예. (0) | 2019.12.06 |