문제

크기가 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가 주어진다. N은 20보다 작거나 같은 자연수이고, K는 0보다 크거나 같고, N-1보다 작거나 같은 정수이다. 둘째 줄에는 수열이 ‘,’로 구분되어 주어진다. 수열을 이루고 있는 수는 절댓값이 100보다 작거나 같은 정수이다.

출력

첫째 줄에 K번 변형한 수열을 ‘,’로 구분하여 출력한다.


나의 코드

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main() {
	int N, K;
	cin >> N >> K;

	int arr[20] = { 0, };
	int j = 0;
	
	string str;
	cin.ignore();
	getline(cin, str);

	for (int i = 0; i < str.size(); i++) {
		int sign = 1;
		if (str[i] == ',') {
			continue;
		}
		else if (str[i] == '-') {
			sign = -1;
			i++;
		}
		int sum = 0;
		while (i < str.size() && str[i] != ',') {
			sum = sum * 10 + sign*(str[i] - '0');
			i++;
		}
		arr[j] = sum;
		j++;
	}
	for (int i = 0; i < K; i++) {
		for (int j = 0; j < N-1; j++) {
			arr[j] = arr[j + 1] - arr[j];
		}
		N--;
	}
	
	for (int i = 0; i < N; i++) {
		if (i == N - 1)
			cout << arr[i];
		else
			cout << arr[i] << ",";
	}

	return 0;
}

 

','로 구분하여 숫자를 입력받는 부분이 꽤 까다로웠다. 또한 음수엔 '-'부호도 있었기 때문에 이전에 블로그에 올린 문제와

비슷하게 getline()으로 받은 string 속에서 숫자를 빼내는 작업을 했다.

정답을 맞추긴 했지만 더 좋은 방법이 무조건 있을 것이라고 생각하고 구글링을 해보니 C++에는 따로 split함수가 없기 때문에 아래와 같이 만들어진 코드를 외워서 비슷한 문제가 나왔을 때 활용하는 것 같았다.

vector<string> split(string input, char delimiter) {
    vector<string> answer;
    stringstream ss(input);
    string temp;

    while(getline(ss, temp, delimiter) {
        answer.push_back(temp);
    }

    return answer;
}

 

그래서 이 코드는 외워 놓는 것이 좋을 것 같다.

이 함수를 활용하여 다시 푼 문제이다.

#include <iostream>
#include <vector>
#include <string>
#include <sstream>

using namespace std;

vector<int> split(string input, char delimiter) {
	vector<int> answer;
	stringstream ss(input);
	string temp;
	while (getline(ss, temp, delimiter)) {
		answer.push_back(stoi(temp));
	}
}

int main() {
	int n, k;
	cin >> n >> k;
	string s;
	cin >> s;
	vector<int> v = split(s, ',');

	while (k--) {
		vector<int> v2;
		for (int i = 0; i < v.size() - 1; i++) {
			v2.push_back(v[i + 1] - v[i]);
		}
		v = v2;
	}
	for (int i = 0; i < v.size(); i++) {
		cout << v[i];
		if (i != v.size() - 1) cout << ",";
	}
	return 0;
}

 

참조

https://kdongree.tistory.com/m/111

 

[백준] 1551번 수열의 변화 (C++) - stringstream, split

문제 https://www.acmicpc.net/problem/1551 1551번: 수열의 변화 첫째 줄에 수열의 크기 N과 K가 주어진다. N은 20보다 작거나 같은 자연수이고, K는 0보다 크거나 같고, N-1보다 작거나 같은 정수이다. 둘째 줄

kdongree.tistory.com

https://chbuljumeok1997.tistory.com/42

 

코테용- c++ split 함수 (string 나누기/string 잘라서 배열에 넣기)

코테를 c++로 하면서 느낀점은..속도를 제외하고 c++의 좋은점을 아직 잘 모르겠다는 점이다.. 항상 코딩테스트를 보면 string을 잘라야하는 순간이 생기는데 그럴때마다 자바로 갈아타고 싶다.. 이

chbuljumeok1997.tistory.com

 

+ Recent posts