작성일 :

문제 링크

1551번 - 수열의 변화

설명

인접한 두 수의 차를 반복적으로 계산하여 수열을 변형하는 문제입니다.

주어진 수열의 길이가 N일 때, 인접한 두 수의 차를 계산하여 길이가 N - 1인 새로운 수열을 생성합니다.

이 작업을 K번 반복한 후의 최종 수열을 구하는 것이 목표입니다.


예를 들어 수열이 5, 6, 3, 9, -1이고, K = 1이면 다음과 같은 변화가 일어납니다:

  • 1단계: 6 - 5, 3 - 6, 9 - 3, -1 - 91, -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" : ",");
}