KDHzoot's Github

Code for study, project, etc

자세히보기

알고리즘/PS

[백준 1111] IQ Test

kdhzoot 2020. 7. 16. 22:38

문제 링크 : 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