※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 1111번 문제인 IQ Test이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/1111
1111번: IQ Test
다음 수를 출력한다. 만약 다음 수가 여러 개일 경우에는 A를 출력하고, 다음 수를 구할 수 없는 경우에는 B를 출력한다.
www.acmicpc.net
나올 수 있는 경우의 수를 차근차근 살펴보면 단순하게 풀 수 있는 문제이다.
1) N=1인 경우, 뒤에 나올 수 있는 수열은 무수히 많으므로 A를 출력한다.
2) N=2인 경우
2-1) 두 수가 다른 경우, 뒤에 나올 수 있는 수열은 무수히 많으므로 A를 출력한다.
2-2) 두 수가 같은 경우, 뒤에 나올 수 있는 수열은 단 한가지(같은 수만이 계속 반복)이므로 그 수를 출력한다.
3) N이 3 이상인 경우
수열의 앞 세 수 x, y, z를 입력받는다.
이 수열은 어떤 항이 k였다면 다음 항은 a*k+b로 계산하므로, a*x+b = y와 a*y+b = z의 두 식으로부터 a와 b의 관계식을 구해낼 수 있다. 이 연립방정식의 "정수"인 a와 b가 존재하는지의 여부를 판단할 수 있는가가 이 문제의 핵심으로, a와 b가 존재한다면 남은 항이 위 식을 만족하는지를 구한 a와 b의 값으로 계산하는 것으로 문제를 해결할 수 있다..
특히, 해가 무수히 많이 존재할 경우와 해가 존재하지 않을 경우에 대한 신경써서 해주자.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N; cin >> N;
if (N == 1) cout << 'A';
else if (N == 2) {
int x, y; cin >> x >> y;
if (x == y) cout << x;
else cout << 'A';
}
else {
int x, y, z; cin >> x >> y >> z;
if (x == y) {
N -= 3;
if (x != z) {
cout << 'B';
return 0;
}
while (N--) {
int next; cin >> next;
if (next != x) {
cout << 'B';
return 0;
}
}
cout << x;
}
else {
if ((z - y) % (y - x) != 0) {
cout << 'B';
return 0;
}
int a = (z - y) / (y - x);
int b = y - x * a;
N -= 3;
while (N--) {
int next; cin >> next;
if (next != a * z + b) {
cout << 'B';
return 0;
}
z = next;
}
cout << a * z + b;
}
}
}
'BOJ' 카테고리의 다른 글
[BOJ 5000 // C++] 빵 정렬 (0) | 2021.06.23 |
---|---|
[BOJ 5002 // C++] 도어맨 (0) | 2021.06.22 |
[BOJ 5397 // C++] 키로거 (0) | 2021.06.20 |
[BOJ 1666 // C++] 최대 증가 직사각형 집합 (0) | 2021.06.19 |
[BOJ 4195 // C++] 친구 네트워크 (0) | 2021.06.18 |