1일1알

백준 4929번 수열 걷기 C++ 본문

알고리즘

백준 4929번 수열 걷기 C++

영춘권의달인 2022. 3. 8. 12:06

출처 : https://www.acmicpc.net/problem/4929

 

두 길을 비교하면서 작은 쪽을 한칸씩 전진시키면서 합을 누적시키고 두 길의 값이 같은 곳에 도달하면 누적된 합 중 큰 값을 최종 합에 추가시키는 방식으로 문제를 해결하였다.

 

#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <iomanip>

using namespace std;
using ll = long long;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	while (true) {
		int l1, l2;
		cin >> l1;
		if (l1 == 0) break;
		vector<int> v1(l1);
		for (int i = 0; i < l1; i++) {
			cin >> v1[i];
		}
		cin >> l2;		
		vector<int> v2(l2);	
		for (int i = 0; i < l2; i++) {
			cin >> v2[i];
		}
		int sum = 0;
		int part_sum1 = 0;
		int part_sum2 = 0;
		int p1 = 0;
		int p2 = 0;
		while (true) {
			if (p1 == l1 && p2 == l2) {
				sum += max(part_sum1, part_sum2);
				break;
			}
			else if (p1 == l1) {
				part_sum2 += v2[p2];
				p2++;
				continue;
			}
			else if (p2 == l2) {
				part_sum1 += v1[p1];
				p1++;
				continue;
			}

			if (v1[p1] > v2[p2]) {
				part_sum2 += v2[p2];
				p2++;
			}
			else if (v1[p1] < v2[p2]) {
				part_sum1 += v1[p1];
				p1++;
			}
			else {
				sum += max(part_sum1, part_sum2);
				sum += v1[p1];
				part_sum1 = 0;
				part_sum2 = 0;
				p1++;
				p2++;
			}
		}
		cout << sum << "\n";
	}
};

'알고리즘' 카테고리의 다른 글

백준 14246번 k보다 큰 구간 C++  (0) 2022.03.10
백준 2118번 두 개의 탑 C++  (0) 2022.03.09
백준 22945번 팀 빌딩 C++  (0) 2022.03.07
백준 12892번 생일 선물 C++  (0) 2022.03.06
백준 10472번 십자뒤집기 C++  (0) 2022.03.05