문제 링크 : https://www.acmicpc.net/problem/1111
1111번: IQ Test
다음 수를 출력한다. 만약 다음 수가 여러 개일 경우에는 A를 출력하고, 다음 수를 구할 수 없는 경우에는 B를 출력한다.
www.acmicpc.net
수학 문제라기보다 예외처리 문제에 가까웠다.
입력이 3개 이상일 때 a와 b를 구하는 방법은 간단하다.
$$x_1 * a + b = x_2$$
$$x_2 * a + b = x_3$$
위 두 식을 연립해서 a와 b를 구할 수 있다.
a와 b를 구했다면 문제에서 요구하는 다음 숫자도 쉽게 구할 수 있다.
이제 예외 상황들을 하나씩 살펴보자.
1. 입력이 하나일 때
다음 수를 알 수 없으므로 A를 출력한다.
2. 입력이 두개일 때
입력이 두개일 때는 만약 두 수가 같다면 다음수도 당연히 그 수가 된다.
물론 a와 b의 값은 무수히 많겠지만 그와 상관 없이 다음수도 전과 똑같은 수가 올 것이다.
만약 두 수가 다르다면 다음수를 알 수 없다. 무수히 많은 a와 b가 가능하기 때문이다.
따라서 A를 출력한다.
3. 입력이 세개 이상이고 맨 앞의 두 수가 같을 때
모든 수가 같다면 새롭게 오는 수도 일정해야 하므로 전과 똑같은 수를 출력한다.
중간에 다른 수가 등장한다면 이는 잘못된 입력이므로 B를 출력한다.
4. 입력이 세개 이상이고 a와 b가 실수일 때
특정 입력에서 a와 b의 값을 구할 때 실수로 구해지는 경우가 있다.
이는 입력이 잘못된 것이므로 B를 출력한다.
5. 위 네가지 경우가 아닌 일반 적인 경우
이제는 맘편하게 a와 b를 구하고 위반되는 입력이 없는지 확인해주면 된다.
만약 중간에 위반되는 입력이 있다면 B를 출력한다.
아니라면 a와 b로 구한 새로운 수를 출력한다.
#include <iostream>
#define n_ 55
using namespace std;
int n;
int arr[n_];
int main(void) {
cin >> n;
for (int i = 0; i < n; i++) {
scanf("%d", arr + i);
}
if (n == 1) {
printf("A\n");
return 0;
}
if (n == 2) {
if (arr[0] == arr[1]) {
printf("%d\n", arr[0]);
return 0;
}
else {
printf("A\n");
return 0;
}
}
if (arr[0] == arr[1]) {
bool chk = true;
for (int i = 0; i < n; i++) {
if (arr[i] != arr[0]) {
chk = false;
}
}
if (chk) {
printf("%d\n", arr[0]);
return 0;
}
else {
printf("B\n");
return 0;
}
}
if ((arr[2] - arr[1]) % (arr[1] - arr[0]) != 0) {
printf("B\n");
return 0;
}
int a = (arr[2] - arr[1]) / (arr[1] - arr[0]);
int b = arr[1] - arr[0] * a;
//cout << a << " " << b << endl;
for (int i = 0; i < n - 1; i++) {
if (arr[i] * a + b != arr[i + 1]) {
printf("B\n");
return 0;
}
}
printf("%d\n", a * arr[n - 1] + b);
return 0;
}
'알고리즘 > PS' 카테고리의 다른 글
[백준 14469] 소가 길을 건너간 이유 3 (0) | 2020.07.29 |
---|---|
[백준 10814] 나이순 정렬 (0) | 2020.07.17 |
[백준 1149] RGB거리 (0) | 2020.07.15 |
[백준 1003] 피보나치 함수 (0) | 2020.07.13 |
[백준 1931] 회의실배정 (0) | 2020.07.13 |