Backend
home

[백준] 수학은 비대면강의입니다

생성일
2025/02/24 05:18
태그
BaekJoon
게시일
2025/02/24
최종 편집 일시
2025/02/24 05:30

문제

해결 방안 고민

손으로는 풀 수 있는데 코드로는 도저히 이해하기 힘든 문제였다.
가감법을 활용하는 것은 알고 있었지만 그걸 어떻게 식으로 표현하느냐가 떠오르지 않았다.
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 를 직접 손으로 풀이하여 일반화된 공식을 유도하는 과정을 거치면 충분히 해결할 수 있는 문제였는데 이제까지 문제풀이를 하면서 이런 일반화 하는 방법을 많이 접해보지 않다 보니 문제풀이에 어려움을 겪은 것이었다.