그냥 하는 노트와 메모장

BOJ 1111 - IQ Test 본문

Solved problems

BOJ 1111 - IQ Test

coloredrabbit 2018. 1. 16. 12:13

우선 ax+b꼴을 예측하기 위해선 적어도 세 개의 숫자가 필요하다. 따라서 N이 1일 때와 N이 2일 때를 따로 처리해주자.


1. N = 1

무조건 답은 'A'다. 다음 숫자를 예측할 (a,b) 짝이 너무 많다.


2. N = 2

만약 두 숫자가 같다면 다음 숫자도 같은 숫자가 된다.

만약 다르다면 (a,b) 짝이 너무 많아서 'A'가 답이 된다.


3. N > 2

ax+b 꼴을 예측하기 위해 첫 세 숫자에 대해 a와 b를 fix 시킨다.

그 다음 그 fixed a,b를 가지고 모든 연속된 두 숫자에 대해 만족하는지 알아보기만 하면 된다.


수열에서 첫 숫자가 x라면 두 번째 수가 y, 다시금 두 번째 수가 x로서 feedback되므로 이 구조를 눈여겨 보자.

ax+b가 모든 연속된 두 숫자에 대해 만족하기 위해선 한 직선에 있어야 한다는 점도 알아야 한다.


x = M[1]-M[0] // x로서의 두 수의 차이

y = M[2]-M[1] // y로서의 두 수의 차이

a = y/x   // a는 기울기

b = M[1] - a*M[0]    // 단순 y 절편, (M[0],M[1])을 ax+b=y에 대입한다.



#include <cstdio>

int main() {
	int N, M[51], i, b, F = 1, x, y, a;
	scanf("%d", &N);
	for (i = 0; i < N; i++)
		scanf("%d", &M[i]);

	if (N == 1) printf("A");
	else if (N == 2) {
		if (M[0] == M[1]) printf("%d",M[0]);
		else printf("A");
	}
	else {
		a = 0;
		x = M[1] - M[0];
		y = M[2] - M[1];
		if (x != 0) a = y / x;
		b = M[1] - a*M[0];
		for (i = 1; i < N; i++) {
			if (M[i] != (M[i - 1] * a + b)) {
				F = 0;
				break;
			}
		}
		if (F) printf("%d", (M[N - 1] * a + b));
		else printf("B");
	}

	return 0;
}


'Solved problems' 카테고리의 다른 글

BOJ 2485 - 가로수  (0) 2018.01.17
BOJ 2481 - 해밍 경로  (0) 2018.01.17
BOJ 1415 - 사탕  (0) 2018.01.16
BOJ 2593 - 엘리베이터  (0) 2018.01.11
BOJ 2679 - Route Redundancy(맨체스터의 도로)  (0) 2018.01.09
Comments