[백준 10539] 수빈이와 수열 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
평균 수열이 주어지는 상황에서, 수열 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;
}