문제
크기가 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
'Algorithm' 카테고리의 다른 글
| 백준 12847번 꿀 아르바이트 (C++) (0) | 2025.04.13 |
|---|---|
| 백준 20057번 마법사 상어와 토네이도 (C++) (0) | 2025.04.04 |
| 백준 1915번 가장 큰 정사각형 (C++) (0) | 2025.03.26 |
| 백준 7490번 0 만들기(C++) (1) | 2025.03.23 |
| 백준 14910 오르막(C++) (1) | 2024.03.05 |