알고리즘/BOJ 문제풀이

[Math] BOJ 1111 IQ Test

4Legs 2021. 1. 18. 22:57

문제 링크 : www.acmicpc.net/problem/1111

 

1111번: IQ Test

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

www.acmicpc.net

정답인 a, b에 대해 제시된 수열은 항상 X(i+1) = a * Xi + b를 만족한다. 즉, 이는 일반항이다.

우리는 제시된 수열의 길이에 따라 Case를 구분할 수 있다.

 

① 제시된 수열의 길이가 1일 때

우리는 a, b를 특정할 수 없다. 다음 수가 아예 없기 때문이다.

이 경우 정답은 A이다.

 

② 제시된 수열의 길이가 2일 때

두 가지 경우로 나뉜다.

제시된 수를 29, 38이라 해보자. 이 때, a = 1, b = 9로 두었을 경우 a, b는 식을 만족시킨다. (38 = 29 * 1 + 9)

하지만 (a = 2, b = -20), (a = 3, b = -49) 등 가능한 순서쌍은 무한히 많다. 따라서 이 때 정답은 A이다.

하지만 제시된 수가 3, 3일 때를 살펴보자. (a = 1, b = 0), (a = 2, b = -3) 등 어떠한 순서쌍을 적용해도 결과는 항상 같다. 즉, (a, b)의 순서쌍은 무한히 많지만 결과는 동일한 값이 나오므로, 이 경우 정답은 수열의 첫번째 수와 같다.

 

③ 제시된 수열의 길이가 3 이상일 때

이제 우리는 3개 이상의 항을 통해 다음 식을 세울 수 있다.

수열의 일반항에 의해 X(i+2) = a * X(i+1) + b 이고, X(i+1) = a * Xi + b 이다.

따라서, X(i+2) - X(i+1) = a(X(i+1) - Xi) 이다.

이 식을 통해 b도 구할 수 있다. b = X(i+1) - a * Xi

즉 이 경우 a, b는 순서쌍 하나로만 나타나게 되므로, 제시된 모든 수열에 대해 a, b를 통해 세운 식을 만족하는지 확인하면 된다.

만족한다면 마지막 수에 대한 결과를, 그렇지 않다면 B를 출력한다.

 

※ 단, a를 구하는 식에서 X(i+1) = Xi일 수 있다. 이 경우에는 ②와 마찬가지로 수열의 모든 수가 수열의 첫 번째 수와 같아야 함에 유의한다.

 

[코드]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <map>
#include <memory.h>
 
using namespace std;
typedef long long ll;
typedef pair<intint> p;
 
int n, seq[50];
 
void get_answer() {
    //예외 : 처음 두 수가 같은 경우, 반드시 세 번째 항도 같아야 함
    if (seq[0== seq[1]) {
        for (int i = 2; i < n; i++) {
            if (seq[i] != seq[0]) {
                printf("B\n");
                return;
            }
        }
        printf("%d\n", seq[0]);
        return;
    }
 
    //첫 번째 수에 대해, 가능한 a, b의 쌍을 구한다.
    int a = (seq[2- seq[1]) / (seq[1- seq[0]);
    int b = seq[2- (seq[1* a);
 
    //나머지 수들에 대해 확인하기
    for (int i = 0; i < n - 1; i++) {
        if (seq[i] * a + b != seq[i + 1]) {
            printf("B\n");
            return;
        }
    }
 
    printf("%d\n", seq[n - 1* a + b);
}
 
void init() {
    cin >> n;
 
    for (int i = 0; i < n; i++cin >> seq[i];
}
 
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(NULL);
 
    init();
    if (n == 1) { printf("A\n"); return 0; }
    if (n == 2) {
        if (seq[0== seq[1]) printf("%d\n", seq[0]);
        else printf("A\n");
        return 0;
    }
    get_answer();
 
    //system("PAUSE");
    return 0;
}
 
cs

 

'알고리즘 > BOJ 문제풀이' 카테고리의 다른 글

[Math] BOJ 8916 이진 검색 트리  (0) 2021.01.23
[MST] BOJ 10423 전기가 부족해  (0) 2021.01.19
[DP] BOJ 1086 박성원  (0) 2021.01.17
[DFS] BOJ 17501 수식 트리  (0) 2021.01.16
[LIS] BOJ 2631 줄세우기  (0) 2021.01.14