[백준 1551] 수열의 변화 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
인접한 두 수의 차를 반복적으로 계산하여 수열을 변형하는 문제입니다.
주어진 수열의 길이가 N
일 때, 인접한 두 수의 차를 계산하여 길이가 N - 1
인 새로운 수열을 생성합니다.
이 작업을 K
번 반복한 후의 최종 수열을 구하는 것이 목표입니다.
예를 들어 수열이 5, 6, 3, 9, -1
이고, K = 1
이면 다음과 같은 변화가 일어납니다:
- 1단계:
6 - 5, 3 - 6, 9 - 3, -1 - 9
→1, -3, 6, -10
이렇게 K
단계까지 진행한 뒤, 남은 수열을 출력하면 됩니다.
접근법
- 입력으로 주어진 수열을 문자열에서 숫자로 파싱합니다.
K
번 반복하면서 매 단계마다 두 수의 차를 계산한 새로운 수열을 만들어 갱신합니다.- 수열의 길이는 매 반복마다
1
씩 줄어들며, 최종적으로N - K
개의 숫자가 남습니다. - 결과 수열을
쉼표(,)
로 구분하여 출력 형식에 맞추어 출력합니다.
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
24
25
26
27
using System;
using System.Collections.Generic;
class Program {
static List<int> MakeNew(List<int> seq) {
var next = new List<int>();
for (int i = 0; i < seq.Count - 1; i++)
next.Add(seq[i + 1] - seq[i]);
return next;
}
static void Main() {
var tokens = Console.ReadLine().Split();
int n = int.Parse(tokens[0]);
int k = int.Parse(tokens[1]);
var input = Console.ReadLine().Split(',');
var seq = new List<int>();
foreach (var s in input)
seq.Add(int.Parse(s));
for (int i = 0; i < k; i++)
seq = MakeNew(seq);
Console.WriteLine(string.Join(",", seq));
}
}
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
#include <bits/stdc++.h>
using namespace std;
typedef vector<int> vi;
vi makeNewSeq(const vi& seq) {
vi ret;
for (int i = 0; i < (int)seq.size() - 1; i++)
ret.push_back(seq[i + 1] - seq[i]);
return ret;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int len, k; cin >> len >> k;
string s; cin >> s;
stringstream ss(s);
vi seq;
string token;
while (getline(ss, token, ','))
seq.push_back(stoi(token));
for (int i = 0; i < k; i++)
seq = makeNewSeq(seq);
for (int i = 0; i < (int)seq.size(); i++)
cout << seq[i] << (i + 1 == (int)seq.size() ? "\n" : ",");
}