방명록
- 백준 10773번 - 제로 (C/C++)2025년 01월 18일 16시 48분 18초에 업로드 된 글입니다.작성자: 방세연
이전에 풀었던 문제와 제목이 비슷해보여서 친근해서 선택했다.
이번에도 0을 찾아내는 문제다.
입력 첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000) 이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경우 해당 수를 쓴다. 정수가 "0"일 경우에 지울 수 있는 수가 있음을 보장할 수 있다. 출력 재민이가 최종적으로 적어 낸 수의 합을 출력한다. 최종적으로 적어낸 수의 합은 231-1보다 작거나 같은 정수이다.
예를들어 4를 입력하면 총 4개의 숫자를 입력받게 되는데,
이때 원소에 0이 포함되어 있다면 그 앞 가장 최근의 원소를 지우거나 카운트되지 않도록 해야 한다.
(이때 그 앞의 원소도 0이라면 이 경우 원소를 패스하고 그 앞으로 넘어간다.)
#include <iostream> #include <vector> #include <algorithm> #include <string> #include <numeric> using namespace std; void calculate(vector<int>& vec, int i) { if (vec[i] == 0) { if (vec[i - 1] != 0) { vec[i - 1] = 0; } else { calculate(vec, i - 1); } } } int main() { int K; cin >> K; vector<int> vec(K); for (int i = 0; i < K; i++) {cin >> vec[i];} for (int i = 1; i < K; i++) {calculate(vec, i);} int sum = accumulate(vec.begin(), vec.end(), 0); cout << sum << endl; }
그 이전의 원소에 대한 함수를 호출하기 위해 calculate라는 함수를 따로 만들어주었다.
void calculate(vector<int>& vec, int i) { if (vec[i] == 0) { if (vec[i - 1] != 0) { vec[i - 1] = 0; } else { calculate(vec, i - 1); } } }
calculate 함수는 for문 내에서 vector의 요소에 0이 포함되어있는지 확인하고,
가장 최근의 수를 지우는 알고리즘을 수행하는 함수로 사용했다.
만약 vec[i-1]의 원소가 0이라면, 다시 calculate( vec, i-1)의 함수를 순회한다. 이 과정을 반복한다.
int sum = accumulate(vec.begin(), vec.end(), 0);
accumulate()은 C++내에서 벡터 값들의 합산을 출력해준다.
사용 방법은 vec.begin(), vec.end()를 사용해 구간을 설정해준다는 점은 같고,
sum 변수의 시작 위치를 0으로 설정해주면 된다.
다음글이 없습니다.이전글이 없습니다.댓글