본문 바로가기

Algorithm Problems/수학

[백준/C++] 28418번: 회장님께 바치는 합성함수

문제

https://www.acmicpc.net/problem/28418


문제 요약

첫째 줄에 f(x) 함수의 2차항, 1차항, 상수항의 계수가, 둘째 줄에 g(x)의 1차항, 상수항의 계수가 주어진다.

 

p(x) = f(g(x)), q(x) = g(f(x)) 일 때, 두 함수의 교점 개수를 파악한다.


코드

#include <iostream>
#include <vector>

using namespace std;

int p[3], q[3], ans[3];
int a, b, c, d, e;
int root;

int main() {
	cin >> a >> b >> c >> d >> e;

	p[2] = a * d * d;
	p[1] = 2 * a * d * e + b * d;
	p[0] = a * e * e + b * e + c;

	q[2] = d * a;
	q[1] = d * b;
	q[0] = c * d + e;


	for (int i = 2; i >= 0; i--) {
		ans[i] = p[i] - q[i];
	}

	root = (ans[1] * ans[1]) - (4 * ans[2] * ans[0]);
	
	if (ans[2] == 0) {
		if (ans[1] != 0) {
			cout << "Remember my character";
		}
		else if (p[2] == q[2] && p[1] == q[1] && p[0] == q[0]) cout << "Nice";
		else cout << "Head on";
	}
	else if (root > 0) {
		cout << "Go ahead";
	}
	else if (root == 0) {
		cout << "Remember my character";
	}
	else if (root < 0) {
		cout << "Head on";
	}

	return 0;
}

코드 설명

1. f(x)를 ax^2 + bx + c, g(x)를 dx + e 로 가정하고, 변수 a, b, c, d, e를 입력 받는다.

 

2. 합성 함수 p(x)와 q(x)를 구하고, 각각 배열 p, q에 저장한다.

ex) p[i] : p[i] * x^i

+ 조금 복잡하지만, 일일이 계산한다.

 

3. p(x)와 q(x)의 연립 방정식을 배열 ans에 저장한다. 

 

4. 연립 방정식의 2차항이 0일 경우, 판별식을 사용할 수 없으므로 따로 조건 분기한다.

- 연립 방정식이 1차 함수일 경우, 근을 1개 갖는다.

- 모든 항의 계수가 같을 경우, 일치하므로 무한한 근을 갖는다.

- 연립 방정식이 상수 함수일 경우, 근이 없다.

 

5. 연립 방정식이 2차 함수일 경우, 판별식을 사용하여 근의 개수를 한다.


고찰

판별식은 2차 방정식에서만 사용할 수 있다. 즉, 2차항의 계수가 0일 경우에는 사용하지 못한다.