(C++) 백준 1551번 - 수열의 변화

코딩너구리·2025년 10월 2일

코딩 문제 풀이

목록 보기
11/266

https://www.acmicpc.net/problem/1551

문제

> 크기가 N인 수열A가 주어졌을때 인접한 두 원소의 차이를 이용해 크기가 N-1인 수열B를 만들 수 있다.
> A = {5,6,3,9,-1}, B = {6-5,3-6,9-3,-1-9} = {1,-3,6,-10} 즉 B[i] = A[i+1] - A[i]이다.
> 수열 A가 주어졌을때 이를 K번 했을때 나오는 수열을 구해라.

접근

N과 K, 수열A를 입력받고 문제에 주어진 수식을 적용해 K번 반복한다.

문제해결

> N과 K를 입력받고 벡터 배열A에 넣는데 ,를 제거하며 입력받는다.
> K가 0이거나 N이 1일땐 수식을 적용할 수 없으므로 따로 경우를 빼서 처리해준다.
> 나머지 경우는 문제에서 준 수식에 넣어 처리한다.
> 출력할때 마지막 인덱스 전까진 , 를 출력하고 마지막엔 값만 출력한다.

코드

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

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

	int N, K;
	cin >> N >> K;

	vector<int> A(N);
	for (int i = 0; i < N; i++)
	{
		cin >> A[i];
		if (i != N - 1)
			cin.ignore(1, ',');
	}
	if (K == 0 || N == 1)
	{
		for (int j = 0; j < N; j++)
		{
			if (N - j > 1)
				cout << A[j] << ",";
			else
				cout << A[j];
		}
	}
	else
	{
		for (int i = 0; i < K; i++)
		{
			vector<int> B;
			for (int j = 0; j < A.size() - 1; j++)
			{
				B.push_back(A[j + 1] - A[j]);
			}
			A = B;
		}
		for (int t = 0; t < A.size(); t++)
		{
			if (A.size() - t > 1)
				cout << A[t] << ",";
			else
				cout << A[t];
		}
	}

}

후기

정작 코드는 10분도 안돼서 썼는데 입력형식의 콤마와 출력의 콤마.. 그놈의 콤마 때문에 몇시간 걸렸다.
ignore()의 존재를 처음 알게되었다. 입력의 특정 문자를 제거하며 받아준다.
문자열로 입력받아 숫자로 변환해서 할 수 있지만 왠지 오기가 생겨 죽어도 숫자로 처리하고싶었다..

0개의 댓글