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; }