작성일 :

문제 링크

1731번 - 추론

설명

주어진 수열이 등차수열인지 등비수열인지 판별한 뒤,

그 규칙에 따라 다음 항을 계산하여 출력하는 문제입니다.


접근법

  • 입력으로 주어진 수열의 길이는 최소 3 이상이므로,
    앞의 몇 항을 비교하여 등차인지 등비인지 충분히 판단할 수 있습니다.

  • 수열의 첫 번째, 두 번째 항을 기준으로 다음과 같이 두 가지 가능성을 확인합니다.
    • 등차수열인 경우: 두 수의 차이 d = 두 번째 항 - 첫 번째 항
    • 등비수열인 경우: 두 수의 비율 r = 두 번째 항 ÷ 첫 번째 항
  • 이후 전체 수열을 순회하며,
    • 각 인접한 두 항의 차이가 항상 d이면 등차수열
    • 각 인접한 두 항의 비율이 항상 r이면 등비수열입니다.


  • 주어진 수열이 등차수열이면 다음 항은:
    \(a_n = a_ + d\)

  • 등비수열이면 다음 항은:
    \(a_n = a_ \times r\)



Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Linq;

class Program {
  static void Main() {
    int n = int.Parse(Console.ReadLine());

    var a = new int[n];
    for (int i = 0; i < n; i++)
      a[i] = int.Parse(Console.ReadLine());

    bool isArith = true;
    int d = a[1] - a[0];
    for (int i = 2; i < n; i++)
      if (a[i] - a[i - 1] != d)
        isArith = false;

    int ans = isArith ? a[n - 1] + d : a[n - 1] * (a[1] / a[0]);
    Console.WriteLine(ans);
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <bits/stdc++.h>
using namespace std;
typedef vector<int> vi;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int n; cin >> n;
  vi a(n);
  for (int i = 0; i < n; i++)
    cin >> a[i];

  bool isArith = true;
  int d = a[1] - a[0];
  for (int i = 2; i < n; i++)
    if (a[i] - a[i - 1] != d) isArith = false;

  int ans = isArith ? a[n - 1] + d : a[n - 1] * (a[1] / a[0]);
  cout << ans << "\n";

  return 0;
}