※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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;
		}
	}
}
728x90

'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

+ Recent posts