※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 19941번 문제인 햄버거 분배이다.
문제는 아래 링크를 확인하자.

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

 

19941번: 햄버거 분배

기다란 벤치 모양의 식탁에 사람들과 햄버거가 아래와 같이 단위 간격으로 놓여 있다. 사람들은 자신의 위치에서 거리가 $K$ 이하인 햄버거를 먹을 수 있다. 햄버거 사람 햄버거 사람 햄버거 사

www.acmicpc.net

거리가 K 이하인 햄버거의 최대 매칭을 구하는 문제이다.

 

맨 왼쪽에 있는 사람서부터 살펴볼 때, 이 사람이 먹을 수 있는 햄버거가 여럿이라면 그중 가장 왼쪽에 있는 햄버거를 선택하여 먹는다면 항상 최선의 경우중 하나를 찾을 수 있다. 그 뒤에 햄버거를 선택할 사람의 선택폭을 최소화하여 줄이기 때문이다.

 

따라서, 현재 살피고 있는 사람과 햄버거를 가리키는 index 변수를 만들어 greedy하게 탐색하는 것으로 문제를 해결할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <string>
using namespace std;

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

	int N, K; cin >> N >> K;
	string s; cin >> s;

	int H = 0, P = 0, ans = 0;
	while (s[H] == 'P') {
		H++;
		if (H == N) break;
	}
	while (s[P] == 'H') {
		P++;
		if (P == N) break;
	}

	while (H < N && P < N) {
		if (abs(H - P) <= K) {
			ans++;
			H++;
			P++;
		}
		else {
			if (H < P) H++;
			else P++;
		}

		while (s[H] == 'P') {
			H++;
			if (H == N) break;
		}
		while (s[P] == 'H') {
			P++;
			if (P == N) break;
		}
	}

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 23237 // C++] How Many Subtrees?  (0) 2021.12.29
[BOJ 1648 // C++] 격자판 채우기  (0) 2021.12.28
[BOJ 19939 // C++] 박 터뜨리기  (0) 2021.12.26
[BOJ 2303 // C++] 숫자 게임  (0) 2021.12.25
[BOJ 22021 // C++] 자동분무기  (0) 2021.12.24

+ Recent posts