[Java] 백준 19941 햄버거 분배

hyunnzl·2024년 12월 10일

백준

목록 보기
9/116
post-thumbnail

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

난이도

실버3

문제

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

햄버거 사람 햄버거 사람 햄버거 사람 햄버거 햄버거 사람 사람 햄버거 사람
1 2 3 4 5 6 7 8 9 10 11 12

위의 상태에서
K=1K = 1인 경우를 생각해보자. 이 경우 모든 사람은 자신과 인접한 햄버거만 먹을 수 있다. 10번의 위치에 있는 사람은 11번 위치에 있는 햄버거를 먹을 수 있다. 이 경우 다음과 같이 최대 5명의 사람이 햄버거를 먹을 수 있다.

2번 위치에 있는 사람: 1번 위치에 있는 햄버거
4번 위치에 있는 사람: 5번 위치에 있는 햄버거
6번 위치에 있는 사람: 7번 위치에 있는 햄버거
9번 위치에 있는 사람: 8번 위치에 있는 햄버거
10번 위치에 있는 사람: 11번 위치에 있는 햄버거
12번 위치에 있는 사람: 먹을 수 있는 햄버거가 없음

K=2K = 2인 경우에는 6명 모두가 햄버거를 먹을 수 있다.

2번 위치에 있는 사람: 1번 위치에 있는 햄버거
4번 위치에 있는 사람: 3번 위치에 있는 햄버거
6번 위치에 있는 사람: 5번 위치에 있는 햄버거
9번 위치에 있는 사람: 7번 위치에 있는 햄버거
10번 위치에 있는 사람: 8번 위치에 있는 햄버거
12번 위치에 있는 사람: 11번 위치에 있는 햄버거
식탁의 길이 NN, 햄버거를 선택할 수 있는 거리 KK, 사람과 햄버거의 위치가 주어졌을 때, 햄버거를 먹을 수 있는 사람의 최대 수를 구하는 프로그램을 작성하시오.

입력

첫 줄에 두 정수 NN
KK가 있다. 그리고 다음 줄에 사람과 햄버거의 위치가 문자 P(사람)와 H(햄버거)로 이루어지는 길이
NN인 문자열로 주어진다.

출력

첫 줄에 햄버거를 먹을 수 있는 최대 사람 수를 나타낸다.

내 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int K = Integer.parseInt(st.nextToken());

		int ans = 0;
		String line = br.readLine();
		int[] h = new int[N];
		int[] p = new int[N];
		for (int i = 0; i < N; i++) {
			Character c = line.charAt(i);
			if (c == 'H') {
				h[i] = 1;
			} else {
				p[i] = 1;
			}
		}

		for (int i = 0; i < N; i++) {
			if (p[i] == 0)
				continue;
			boolean flag = false;
			for (int j = K; j > 0; j--) {
				if (i - j >= 0) {
					if (h[i - j] == 1) {
						h[i - j] = 0;
						flag = true;
						ans++;
						break;
					}
				}
			}
			if (flag)
				continue;
			for (int j = 1; j <= K; j++) {
				if (i + j < N) {
					if (h[i + j] == 1) {
						h[i + j] = 0;
						ans++;
						break;
					}
				}
			}
		}

		System.out.println(ans);
	}
}

햄버거가 있는 위치 h, 사람이 있는 위치 p 를 따로 저장했다.
라인의 처음부터 끝까지 돌면서 사람이 있는 위치만 햄버거를 먹는다.

앞뒤로 K 만큼의 인덱스 범위를 확인하면서 햄버거를 먹는데,
그리디하게 풀기 위해 제일 앞(왼쪽) 인덱스부터 확인한다.
i-K 부터 i-1 까지 먼저 확인하고 먹을 수 있는 햄버거가 없다면,
i+1 부터 i+K 까지도 확인을 해줘야 한다.

반복문을 돌면서 하나라도 먹을 수 있으면 바로 빠져나와야 하고,
먹었다는 표시를 하기 위해 h[해당 위치]0 으로 업데이트 해줘야 한다.

현재 인덱스보다 앞을 확인할 때는 꼭 i-K부터 i-1까지로 확인을 해야한다.
i-1 부터 i-K 로 하면 최대한 많은 사람이 먹을 수 있는 방법이 아니다.


0개의 댓글