백준 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';
}
'알고리즘 > 구현' 카테고리의 다른 글
백준 5212번: 지구 온난화 (C++) (0) | 2023.02.22 |
---|---|
백준 9047번: 6174 (C++) (0) | 2023.02.17 |
백준 2920번: 음계 (C++) (0) | 2023.01.26 |
백준 1292번: 쉽게 푸는 문제 (C++) (0) | 2023.01.18 |
백준 1652번: 누울 자리를 찾아라 (C++) (0) | 2023.01.18 |