본문 바로가기
알고리즘/알고리즘

[C++]백준 1111번 : IQ Test

by 두둠칫 2020. 11. 3.

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

 

1111번: IQ Test

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

www.acmicpc.net

1. 접근

수열의 패턴을 찾기 위해 a와 b를 기준으로 반복문을 통해 결과를 판별하고자 함

 

2. 틀린 이유

a와 b의 범위는 제한이 없기 때문에 불가능

따라서 수열의 형태를 기준으로 3가지 결론을 판별해야함

 

3. 풀이

1) 답이 하나 : 수열의 크기가 2이면서 같은 수, 수열의 모든 원소가 같은 패턴을 가질 경우

2) 답을 낼 수 없음 : 수열의 크기가 3이상이면서 처음 3원소로 구한 패턴에 맞지 않은 원소가 있는 경우(즉 패턴이 없는 수열인 경우)

3) 답이 여러 개 : 수열의 크기가 1, 수열의 크기가 2이면서 다른 수일 경우

 

혼자 꼬아서 생각하며 시간이 오래 걸린 문제

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int N, num[50];

int main(){

	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

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

	if (N == 1){
		cout << "A\n";
		return 0;
	}
	if (N == 2){
		if (num[0] == num[1])
			cout << num[1];
		else
			cout << "A\n";
		
		return 0;
	}
	else{
		int a = 0;
		if (num[1] - num[0] != 0)
			a = (num[2] - num[1]) / (num[1] - num[0]);

		int b = num[1] - num[0] * a;
		
		for (int i = 1; i < N; i++){
			if (num[i] != num[i - 1] * a + b){
				cout << "B\n";
				return 0;
			}
		}
		
		cout << num[N - 1] * a + b;
	}

	return 0;
}