백준 19532 - 수학은 비대면강의입니다

황재진·2024년 2월 24일

백준

목록 보기
1/54
post-thumbnail

연립방정식의 해 x,y를 구하는 문제입니다.
-999에서 999까지 범위가 정해져있고 그 범위가 크지 않아 모든 경우의 수를 체크해도 되지만, 연립방정식을 풀어 x,y를 구하는 식을 만들어 활용했습니다.

{ax+by=cdx+ey=faex+bey=cedbx+eby=fb(aedb)x=cefbx=cefbaedbadx+bdy=cddax+eay=fa(bdea)x=cdfax=cdfabdea\begin{cases} ax+by=c \\ dx+ey=f\end{cases} \\ ㅤ \\ aex+bey=ce \\ dbx+eby=fb \\ (ae-db)x=ce-fb \\ x={ce-fb\over{ae-db}} \\ ㅤ \\ adx+bdy=cd \\ dax+eay=fa \\ (bd-ea)x=cd-fa \\ x={cd-fa\over{bd-ea}}

코드는 다음과 같습니다.

	int a, b, c, d, e, f, x, y;
	std::cin >> a >> b >> c >> d >> e >> f;

	x = (c * e - f * b) / (a * e - d * b);
	y = (c * d - f * a) / (b * d - e * a);

	std::cout << x << " " << y;

2번째 방식

모든 경우의 수를 체크하는 방식입니다.

	int a, b, c, d, e, f, x, y;
	std::cin >> a >> b >> c >> d >> e >> f;

	for (x = -999; x <= 999; x++)
	{
		for (y = -999; y <= 999; y++)
		{
			if (a * x + b * y == c && d * x + e * y == f)
			{
				std::cout << x << " " << y;
				//return 0;
			}
		}
	}

3번째 방식

가장 먼저 소개한 방식의 과정을 모두 코드로 구현한 경우입니다. 가장 먼저 시도했던 방식이며, 이 방식으로도 정답이 뜨지만 효율적인 방식은 아닙니다.

	int a, b, c, d, e, f, x, y;
	int copyA, copyB, copyC, copyD, copyE, copyF;
	int eq_A, eq_B, eq_C;

	std::cin >> a >> b >> c >> d >> e >> f;

	if (a != 0)
	{
		copyA = a * d;
		copyB = b * d;
		copyC = c * d;

		copyD = d * a;
		copyE = e * a;
		copyF = f * a;

		eq_B = copyB - copyE;
		eq_C = copyC - copyF;
		y = eq_C / eq_B;

		if (a != 0)
			x = (c - b * y) / a;
		else
			x = c - b * y;
	}
	else
	{
		copyB = b * e;
		copyA = a * e;
		copyC = c * e;

		copyE = e * b;
		copyD = d * b;
		copyF = f * b;

		eq_A = copyA - copyD;
		eq_C = copyC - copyF;
		x = eq_C / eq_A;

		if (b != 0)
			y = (c - a * x) / b;
		else
			y = c - a * x;
	}

	std::cout << x << " " << y;
profile
프로그래밍, 쉐이더 등 이것저것 다해보는 게임 개발자입니다

0개의 댓글