문제
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일 경우에는 사용하지 못한다.
'Algorithm Problems > 수학' 카테고리의 다른 글
[백준/C++] 9471번: 피사노 주기 (2) | 2024.08.04 |
---|---|
[백준/C++] 18110번: solved.ac (1) | 2024.06.04 |
[백준/C++] 5692번: 팩토리얼 진법 (0) | 2024.05.18 |
[백준/C++] 5618번: 공약수 (0) | 2024.04.21 |
[백준/C++] 14651번: 걷다보니 신천역 삼 (Large) (2) | 2024.02.11 |