문제
해결 방안 고민
•
손으로는 풀 수 있는데 코드로는 도저히 이해하기 힘든 문제였다.
•
가감법을 활용하는 것은 알고 있었지만 그걸 어떻게 식으로 표현하느냐가 떠오르지 않았다.
ax + by = c
dx + ey = f
ae
ce
db
fb
(a - d)x + (b - e)y = c - f
(a - d)x = c - f + (b - e)y
ax - dx = c - f + by - ey
=> x = c - f + (b - e)y / (a - d)
x = -1 - 7 + (3 - 1)y / 1 - 4
x = -8 + 2y / -3
(b - e)y = (c - f) - (a - d)x
=> y = (c - f) - (a - d)x / (b - e)
y = (-1 - 7) - (1 - 4)x / (3 - 1)
y = -8 + 3x / 2
x = [-8 + 2((-8 + 3x) / 2)] / -3
=> x, y 출력
// a, b, c, d, e, f 차례대로 입력
x + 3y = -1 => ax + by = e
4x + y = 7 => cx + dy = f
===
int x = (ce - bf) / (ae - bd);
int y = (cd - af) / (bd - ae);
a b c d e f
1 3 -1 4 1 7
a, d => a != d && (a > d || d > a), a * d or d * a
b, e
|a - d| < |b - e| or |a - d| > |b - e|
a * d
x = 1, 4
y = 3, 1
우항 = -1, 7
x1 * y1 - x2 * y2 = -1
x1 * y2 + x2 * y1 = 12
Markdown
복사
해결 방법
•
for문을 활용하여 문제를 해결하는 방법도 있었지만 그보다는 좀 더 일반화된 해결 방법을 알고 싶었다.
•
이런 형태로 문제를 해결할 수 있다고 하는데 식으로 정리하면 다음과 같다.
◦
x = (ce - bf) / (ae - bd);
◦
y = (cd - af) / (bd - ae);
•
사실 위의 식이 어떻게 나왔는지 이해가 잘 가지 않는다.
•
그래서 찾아봤더니 다음과 같은 결과를 확인할 수 있었다.
크래머 공식을 통한 유도
•
행렬식 계산
◦
만약 세모가 0이라면 이 연립방정식은 해가 없거나 무수히 많은 해를 가질 수 있다.
◦
x, y 구하기
대입법을 통한 유도
•
첫 번째 방정식에서 x를 y에 대한 식으로 정리
•
두 번째 방정식 x에 대입
•
y 구하기
•
y를 첫 번째 방정식에 대입하여 x 구하기
코드
package algo250224;
import java.io.*;
import java.util.*;
// 수학은 비대면강의입니다 - 브론즈 2
public class Baek19532 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// a, b, c, d, e, f 차례대로 입력
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
int d = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
int f = Integer.parseInt(st.nextToken());
int x = (c * e - b * f) / (a * e - b * d);
int y = (c * d - a * f) / (b * d - a * e);
bw.write(x + " " + y);
bw.flush();
bw.close();
br.close();
}
}
Java
복사
정리
•
결론적으로 ax + by =c, cx + dy = f 를 직접 손으로 풀이하여 일반화된 공식을 유도하는 과정을 거치면 충분히 해결할 수 있는 문제였는데 이제까지 문제풀이를 하면서 이런 일반화 하는 방법을 많이 접해보지 않다 보니 문제풀이에 어려움을 겪은 것이었다.