백준 1111. IQ Test(C++)
2023. 7. 2. 23:06ㆍ카테고리 없음
1111번: IQ Test
다음 수를 출력한다. 만약 다음 수가 여러 개일 경우에는 A를 출력하고, 다음 수를 구할 수 없는 경우에는 B를 출력한다.
www.acmicpc.net
입력
- 첫째 줄에 N이 주어진다. 둘째 줄에는 N개의 수가 주어진다.
- 이 수는 모두 절댓값이 100보다 작거나 같은 정수이다.
문제 풀이
- 규칙을 도출해서 풀이를 해야하는 문제다.
- 주어진 수열을 분석해보면 계차수열이 등비수열을 이룬다는 것을 알 수있다.
- 여기서 계차란 수열의 뒤 항에서 앞의 항을 뺀 수를 말한다.
- 따라서 계차수열이란 위와 같은 계차로 이루어진 수열이다
- 위와 같은 수열의 특징을 이용하여 계차수열의 공비만 알아낸다면 다음 항을 도출할 수 있다.
- 코드는 아래와 같다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N, d, result;
vector<int>arr;
vector<int>diff;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N;
for (int i = 0; i < N; i++) {
int tmp;
cin >> tmp;
arr.push_back(tmp);
}
if (N == 1) {
cout << "A";
}
else if (N == 2) {
if (arr[0] == arr[1]) {
cout << arr[0];
}
else {
cout << "A";
}
}
else {
int d1 = arr[1] - arr[0];
int d2 = arr[2] - arr[1];
if (d1 == 0) {
if (d2 != 0) {
cout << "B";
}
else {
int flag = 0;
for (int i = 3; i<int(arr.size()); i++) {
int tmp = arr[i] - arr[i - 1];
if (tmp != 0) {
flag = 1;
break;
}
}
if (flag == 1) {
cout << "B";
}
else {
cout << arr[0];
}
}
}
else {
if (d2 % d1 != 0) {
cout << "B";
}
else {
int r = d2 / d1;
int flag = 0;
diff.push_back(d1);
diff.push_back(d2);
for (int i = 3; i<int(arr.size()); i++) {
int tmp = arr[i] - arr[i - 1];
if (tmp != d2 * r) {
flag = 1;
break;
}
diff.push_back(tmp);
d2 = tmp;
}
if (flag == 1) {
cout << "B";
}
else {
cout << arr[N - 1] + diff[N - 2] * r;
}
}
}
}
return 0;
}
