반응형
이번에는 백준 브루트 포스 문제 중 연립방정식을 풀어야 하는 '수학은 비대면강의입니다'를 풀어보자.
이 문제는 크게 두 가지 방법으로 풀 수 있다.
- 브루트 포스 (for문 반복문 활용)
- Cramer 공식 (수학 지식 필요)
1번은 모든 시도를 다 해보는 것이기 때문에 우리가 쉽게 생각할 수 있는 부분이라고 생각이 들고
2번은 수없이 많은 수학 문제를 풀면서 얻은 내공 또는 선형대수학을 공부하던 시절을 기억해야 하기에 비전공자라면 쉽게 떠오르지 않을 수 있다.
하지만 2번이 더 효과적이라는 것!!
그렇지만 브루트 포스 관점에서 1번이 오히려 백준이 요구하는 정답에 가깝지 않나 생각이 든다.
방법 1: 브루트 포스
브루트 포스는 생각보다 간단하다.
모든 값은 -999와 999사이의 정수 값으로 할당이 되고, 또 유일한 해가 있는 문제이기 때문에 다음과 같이 for문을 사용해서 문제를 해결 할 수 있다.
if __name__ == '__main__':
a, b, c, d, e, f = map(int, input().split())
for i in range(-999, 1000):
for j in range(-999, 1000):
if ((a * i) + (b * j) == c) and ((d * i) + (e * j) == f):
print(i, j)
위 for 문은 모든 경우의 수를 다 훑고 지나가기 때문에 첫번째 방정식과 두번째 방정식의 해가 되는 i와 j를 찾을 수 있다.
방법 2: Cramer's Rule
크래머 규칙으로도 연립방정식의 해를 구할 수 있다.
이 경우에서는 Cramer 규칙이 더 쉽고 빠르게 해를 찾게 해준다.
다음과 같은 연립방정식이 있을 때,
$$ ax + by = c $$
$$ dx + ey = f $$
위 방정식의 해는 Cramer's Rule을 활용하여 다음과 같이 계산할 수 있다.
$$ x = \frac{ce - bf}{ae-bd} $$
$$ y = \frac{af - cd}{ae-bd} $$
따라서, 정답을 도출하는 코드는 다음과 같다.
a, b, c, d, e, f = map(int, input().split())
print((c*e-b*f)//(a*e-b*d), (a*f-d*c)//(a*e-b*d))
반응형
'알고리즘' 카테고리의 다른 글
투 포인터 (two pointer) 알고리즘이란? (1) | 2024.04.02 |
---|---|
[leetcode 42] Trapping Rain Water - hard (0) | 2024.04.01 |
[백준 24313] 점근적 표기 1 문제 풀이 & 해설 - 파이썬 (0) | 2024.03.24 |
[python] 등차수열과 등차수열의 합 (0) | 2024.03.24 |
[백준 9506] 약수 합 - 파이썬 (0) | 2024.03.18 |