백준 1111번: IQ Test (C++)

2023. 1. 18. 01:26알고리즘/수학

https://www.acmicpc.net/problem/1111

 

1111번: IQ Test

다음 수를 출력한다. 만약 다음 수가 여러 개일 경우에는 A를 출력하고, 다음 수를 구할 수 없는 경우에는 B를 출력한다.

www.acmicpc.net

 

풀이

풀어보려고 시도했으나 접근법을 몰라 풀이 방법만 찾아봤다.

그리고 나름대로 다시 분석하여 풀어봤다.

케이스를 나누어서 구하는 방식이었는데 공식을 보니 고등학교때 풀었던 변수의 범위에 따라 케이스를 나누어서 계산하는 문제가 생각났다.

 

우선 차례대로 식을 쓰면 이런 느낌이다.

 

그리고 여기서 첫번째 식과 두번째 식을 연립해서 a와 b에 대한 식으로 나타내면 

이런식으로 나타낼 수 있다.

이제 N과 X항에 따라 각 케이스를 구할 수 있다.

 

 N = 1 , 

먼저 X1 밖에 존재하지 않는다면, X2와 X3는 알 수 없다. (답이 여려 개가 될 수 있다.)

즉, N = 1 일때는 무조건 A 를 출력한다.

 

 N = 2 , 

X1과 X2가 존재할 때, X3의 여부는 분모인 X2 - X1에 따라 달라진다.

 

X2 = X1이면 분모가 0이기 때문에 X3 - X2 = 0 이어야 한다.

즉, N = 2 이고 X2 = X1 이면 X3 = X2 이다.

 

그리고 X2 != X1 이면 a와 X3는 알 수 없다. (답이 여러 개가 될 수 있다.)

즉, N = 2 이고 X2 != X1 이면 A 를 출력한다.

 

 N >= 3 , 

N이 3이상인 경우에는 a 와 b 를 구할 수 있다.

 

위와 마찬가지로 X2 = X1이면 분모가 0이기 때문에 X3 - X2 = 0 이어야 한다.

모든 항이 마찬가지여야 하기 때문에 N = 3 이고 X2 = X1 이면 모든 항이 같아야 한다.

 

그리고 X2 != X1 이면 a 와 b 를 구해서 조건에 맞지 않는 항이 있다면 B 를 출력하고

반복문을 통과하면 다음 항인 X[N - 1] * a + b 을 출력한다.

 

 

전체 코드

#include <iostream>

using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int N;
	int num[51] = { 0, };
	cin >> N;

	for (int i = 0; i < N; i++) cin >> num[i];

	if (N == 1) cout << 'A';
	else if (N == 2) {
		if (num[0] == num[1]) cout << num[0];
		else cout << 'A';
	}
	else {
		if (num[0] == num[1]) {
			for (int i = 2; i < N; i++) {
				if (num[0] != num[i]) {
					cout << 'B';
					return 0;
				}
			}
			cout << num[0];
		}
		else {
			int a = (num[2] - num[1]) / (num[1] - num[0]);
			int b = num[1] - num[0] * a;
			for (int i = 2; i < N; i++) {
				if (num[i] != num[i-1] * a + b) {
					cout << 'B';
					return 0;
				}
			}
			cout << num[N - 1] * a + b;
		}
	}
}

'알고리즘 > 수학' 카테고리의 다른 글

백준 11947번: 이런 반전이 (C++)  (0) 2023.01.20
백준 2502번: 떡 먹는 호랑이 (C++)  (0) 2023.01.18