작성일 :

문제 링크

10539번 - 수빈이와 수열

설명

평균 수열이 주어지는 상황에서, 수열 B의 길이 N (1 ≤ N ≤ 100)과 B[i] (1 ≤ B[i] ≤ 10,000)가 주어질 때, 원래 수열 A를 복원하는 문제입니다.

B[i]는 A[1]부터 A[i]까지의 평균을 정수로 내림한 값입니다. 예를 들어 A가 [1, 3, 2, 6]이면, B는 [1, 2, 2, 3]이 됩니다. (1/1=1, (1+3)/2=2, (1+3+2)/3=2, (1+3+2+6)/4=3)


접근법

B[i]가 처음 i개 원소의 평균이므로, 처음 i개 원소의 합은 B[i] × i입니다.


i번째 위치까지의 부분합을 S[i]라 하면, S[i] = B[i] × i로 계산할 수 있습니다. A[i]는 S[i]에서 S[i-1]을 뺀 값입니다.

이 방법으로 B 수열을 순회하며 각 A[i]를 계산하여 출력합니다.



Code

C#

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

namespace Solution {
  class Program {
    static void Main(string[] args) {
      var n = int.Parse(Console.ReadLine()!);
      var b = Array.ConvertAll(Console.ReadLine()!.Split(), int.Parse);

      var result = new List<int>();
      var previousSum = 0;
      
      for (var i = 0; i < n; i++) {
        var currentSum = b[i] * (i + 1);
        var a = currentSum - previousSum;
        result.Add(a);
        previousSum = currentSum;
      }
      
      Console.WriteLine(string.Join(" ", result));
    }
  }
}

C++

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
#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 b(n);
  for (int i = 0; i < n; i++)
    cin >> b[i];

  vi result;
  int previousSum = 0;
  
  for (int i = 0; i < n; i++) {
    int currentSum = b[i] * (i + 1);
    int a = currentSum - previousSum;
    result.push_back(a);
    previousSum = currentSum;
  }
  
  for (int i = 0; i < n; i++) {
    cout << result[i];
    if (i + 1 < n) cout << " ";
  }
  cout << "\n";
  
  return 0;
}