카테고리 없음
백준[19941] - 햄버거 분배
빠쿤
2024. 3. 18. 20:31
- 문제: https://www.acmicpc.net/problem/19941
- 분류: 그리디
- 난이도: S3
- 소요시간: 10m
- 자아성찰:
-
- 그리디 알고리즘의 특성을 잘 알 수 있는 문제라고 생각한다.
- "가장 왼쪽에 있는 햄버거를 먹어야 다음 사람이 먹을 햄버거의 경우의 수가 늘어난다" 까지는 바로 떠올랐다.
- 하지만 위 조건에만 너무 심취해서 "범위 내 왼쪽에 햄버거가 없다면, 오른쪽에서 가장 가까운 햄버거를 먹는다" 라는 조건을 놓쳐 처음 제출 했을 때 틀렸다.
- HPHPHPHPHP 형태라면, 오른쪽에 햄버거를 먹어야 최대가 된다.
- 이 때에는 왼쪽과 반대로 가장 가까운 햄버거를 먹어야 다음 사람(오른쪽 사람)이 먹을 수 있는 햄버거의 경우의 수가 늘어난다.
-
19941번: 햄버거 분배
기다란 벤치 모양의 식탁에 사람들과 햄버거가 아래와 같이 단위 간격으로 놓여 있다. 사람들은 자신의 위치에서 거리가 $K$ 이하인 햄버거를 먹을 수 있다. 햄버거 사람 햄버거 사람 햄버거 사
www.acmicpc.net
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class B_19941 {
static String s;
static int[] arr;
static int N, K, result = 0;
static final int H = 0;
static final int P = 1;
static final int EAT = -1;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
arr = new int[N];
s = br.readLine();
// 햄버거, 사람 구분지어 저장
for (int i = 0; i < N; i++) {
arr[i] = s.charAt(i) == 'H' ? H : P;
}
for (int i = 0; i < N; i++) {
int target = arr[i];
// 사람이 아니라면 넘어간다.
if (target != P) continue;
// 왼쪽 햄버거를 먹었는지 여부 판단
boolean isEat = false;
for (int j = i - K; j < i; j++) {
// 범위 유효성 검사
if (j < 0) continue;
// 가장 먼 햄버거인 경우 먹음
if (arr[j] == H) {
arr[j] = EAT;
result++;
isEat = true;
break;
}
}
// 왼쪽에 햄버거가 없다면 오른쪽 탐색
if (!isEat) {
for (int j = i + 1; j <= i + K; j++) {
if (j >= N) break;
// 가장 가까운 햄버거인 경우 먹음
if (arr[j] == H) {
arr[j] = EAT;
result++;
break;
}
}
}
}
System.out.println(result);
}
}