GitHubSeob

C++ / 백준 / 13422 / 도둑 본문

Baekjoon/Gold

C++ / 백준 / 13422 / 도둑

GitHubSeob 2023. 10. 6.
문제

 

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

 

13422번: 도둑

입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫째 줄에 테스트 케이스의 개수를 나타내는 자연수 T가 주어진다. 각각의 테스트 케이스의 첫째 줄에 마

www.acmicpc.net

 

 

문제풀이

 

누적합, 슬라이딩 윈도우 문제이다.

집을 고를 때는 항상 연속된 위치에 있는 집만 고를 수 있다.

붙어있는 m개 만큼의 집을 고르고 돈의 총합을 구해 K보다 작으면 개수를 하나 늘려주면 된다.

 

		for (int idx = 0; idx < M; ++idx) sum += money[idx];		

		if (sum < K) ++answer;

		for (int idx = 1; idx < N; ++idx) {
			sum -= money[idx - 1];
			sum += money[(idx + M - 1) % N];
			if (idx - 1 == (idx + M - 1) % N) break;
			if (sum < K) ++answer;
		}

처음에 0번 위치부터 M-1까지의 돈의 총합을 sum에 저장하고, K보다 작으면 answer에 1을 더한다.

 

그다음에는 idx=1부터 N-1까지 반복한다.

idx-1 위치에 해당하는 집의 돈을 뺀다고 생각하면 된다.

한 집의 돈을 뺐으니 뒤에 있는 집의 돈을 더해야 한다.

집들은 원형으로 이어져있으므로 인덱스가 벡터의 범위를 넘어가는 것을 방지하기 위해 나머지 연산을 통해 다음 집의 위치를 구한다.

만약 뺀 집과 더한 집이 같다면 N==M인 경우이므로 이 경우에는 위에서 이미 구했으므로 break를 통해 반복문을 종료하면 된다.

 

해당 반복문이 종료되면 answer을 출력한다.

 

 

코드
#include <bits/stdc++.h>
using namespace std;

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

	int T(0);
	cin >> T;
	for (int test_case = 1; test_case <= T; ++test_case) {
		int N(0), M(0), K(0);
		cin >> N >> M >> K;
		vector<int>money(N, 0);
		int sum(0), answer(0);

		for (int idx = 0; idx < N; ++idx) cin >> money[idx];		

		for (int idx = 0; idx < M; ++idx) sum += money[idx];		

		if (sum < K) ++answer;

		for (int idx = 1; idx < N; ++idx) {
			sum -= money[idx - 1];
			sum += money[(idx + M - 1) % N];
			if (idx - 1 == (idx + M - 1) % N) break;
			if (sum < K) ++answer;
		}
		cout << answer << '\n';
	}
}

 

'Baekjoon > Gold' 카테고리의 다른 글

C++ / 백준 / 3020 / 개똥벌레  (0) 2024.03.28
C++ / 백준 / 1245 / 농장 관리  (0) 2023.10.15
C++ / 백준 / 14891 / 톱니바퀴  (1) 2023.10.04
C++ / 백준 / 14500 / 테트로미노  (0) 2023.09.21
C++ / 백준 / 13905 / 세부  (0) 2023.09.21