백준 17128번: 소가 정보섬에 올라온 이유 (C++)

2023. 1. 21. 02:33알고리즘/구현

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

 

17128번: 소가 정보섬에 올라온 이유

첫째 줄에 소의 수를 나타내는 N과 욱제가 장난칠 횟수 Q가 주어진다. (4 ≤ N ≤ 200,000, 1 ≤ Q ≤ 200,000) 둘째 줄에 N마리 소들의 품질 점수 Ai가 순서대로 주어진다. (1 ≤ |Ai| ≤ 10) 셋째 줄에

www.acmicpc.net

 

풀이

그림만 보았을 때 원형 큐로 구현해야할 것 같지만 넣고 빼는 과정이 없어서 그냥 배열로 진행했다.

첫번째~세번째 소가 선택될 수도 있기 때문에 배열 뒤에 세마리를 추가로 넣어주었다.

 

4마리씩 묶어서 곱한 값을 cow_mult 배열에 넣어준 다음 총합을 구했다.

장난칠 소가 포함된 cow_mult 배열을 총합에서 빼주고 더하는 과정이 필요했는데

장난칠 소는 - 1을 곱해주기 때문에 그냥 총합에서 장난칠 소의 cow_mult에 - 1을 곱하고 2를 곱해서 sum에 더해주었다.

 

글 쓰면서 정리해보니 그냥 sum += cow_mult[j] * -2; 한 줄로 끝내는게 나았을 것 같다.

 

전체 코드

#include <iostream>
#include <vector>

using namespace std;

int N, Q;
vector<int> cow;
vector<int> cow_mult;
vector<int> q;
int sum = 0;

int kid(int n){
	for (int i = 1; i <= 4; i++) {
		if (n - i < 0) {
			for (int j = N + n - 4; j <= N - 1; j++) {
				cow_mult[j] *= -1;
				sum += cow_mult[j] * 2;
			}
			break;
		}
		else {
			cow_mult[n - i] *= -1;
			sum += cow_mult[n - i] * 2;
		}
	}
	return sum;
}

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

	cin >> N >> Q;

	for (int i = 0; i < N; i++) {
		int a;
		cin >> a;
		cow.push_back(a);
	}

	for (int i = 0; i < Q; i++) {
		int a;
		cin >> a;
		q.push_back(a);
	}

	for (int i = 0; i < 3; i++) cow.push_back(cow[i]);

	for (int i = 0; i < N; i++) {
		int tmp = 1;
		for (int j = 0; j < 4; j++) {
			tmp *= cow[i + j];
		}
		cow_mult.push_back(tmp);
		sum += cow_mult[i];
	}

	for (int i = 0; i < Q; i++) cout << kid(q[i]) << '\n';
}