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

2023. 7. 20. 22:14코딩테스트/백준

[문제]

 

19532번: 수학은 비대면강의입니다

정수 $a$, $b$, $c$, $d$, $e$, $f$가 공백으로 구분되어 차례대로 주어진다. ($-999 \leq a,b,c,d,e,f \leq 999$) 문제에서 언급한 방정식을 만족하는 $\left(x,y\right)$가 유일하게 존재하고, 이 때 $x$와 $y$가 각각 $-

www.acmicpc.net

[풀이]

아래 코드는 아주 지저분하다. 따라서 코드를 보고 이해하지 말고 밑 한국어 글을 보고 이해하길 바란다.
[함수]
gcd : 최대공약수를 구하는 함수 (최소공배수를 구하는 데 필요)
lcm : 최소공배수를 구하는 함수 (식 간 뺄셈을 할 때 a와 d를 동일하게 맞춰줄건데(ax+by=c,dx+ey=f) 이때의 동일한 수는 최소공배수가 되어야 하기 때문)

[경우의 수]
cf) ax+by=c | dx+ey=f
1. a!=0 && b!=0 && d!=0 && e!=0
-> 일반적인 계산 (a와 d를 최소공배수로 동일하게 만들기 위해 각 식에 알맞은 숫자를 곱한 후 뺄셈을 통해 계산)
2. a==0 && e==0
-> -2y=6, 3x=9 처럼 바로 정답이 나올 수 있는 계산
3. b==0 && d==0
-> 3x=9, -2y=6 처럼 바로 정답이 나올 수 있는 계산
4. a==0
->윗줄 식은 바로 정답이 나오지만, 아랫줄 식은 그렇지 않은 계산
5. b==0
->윗줄 식은 바로 정답이 나오지만, 아랫줄 식은 그렇지 않은 계산
6. d==0
->아랫줄 식은 바로 정답이 나오지만, 윗줄 식은 그렇지 않은 계산
7. e==0
->아랫줄 식은 바로 정답이 나오지만, 윗줄 식은 그렇지 않은 계산

[코드]

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

//ax+by=c

//dx+ey=f

int gcd(int p, int q) { // 최대공약수

	if (q == 0)

		return p;

	else

		return gcd(q, p % q);

}

int lcm(int p, int q) { //최소공배수

	return p * q / gcd(p, q);
}

int main(void)

{

	int a, b, c, d, e, f;

	int fir = 0;



	scanf("%d %d %d %d %d %d", &a, &b, &c, &d, &e, &f);



	


	if(a!=0&&b!=0&&d!=0&&e!=0)
	{
		fir = lcm(a, d);



		int ka = fir / a;

		int kd = fir / d;

		a *= ka;

		b *= ka;

		c *= ka;

		d *= kd;

		e *= kd;

		f *= kd;



		int k, z;

		if (b > e) {

			k = b - e;

			z = c - f;

		}

		else {

			k = e - b;

			z = f - c;

		}



		int y = z / k;

		int x;

		x = (c - b * y) / a; //ax+by=c

		printf("%d %d", x, y);
	}
	else if (a == 0&&e==0) {
		int y = c / b;
		int x = f / d;
		printf("%d %d", x, y);
	}
	else if (b == 0 && d == 0) {
		int x = c / a;
		int y = f / e;
		printf("%d %d", x, y);
	}
	else if (a==0) {
		int y = c / b;
		int x = (f - e * y) / d;
		printf("%d %d", x, y);
	}
	else if (d == 0) {
		int y = f / e;
		int x = (c - b * y) / a;
		printf("%d %d", x, y);
	}
	else if (b == 0) {
		int x = c / a;
		int y = (f - d * x) / e;
		printf("%d %d", x, y);
	}
	else if (e == 0) {
		int x = f / d;
		int y = (c - a * x) / b;
		printf("%d %d", x, y);
	}



	return 0;

}