https://www.acmicpc.net/problem/19941
실버3
기다란 벤치 모양의 식탁에 사람들과 햄버거가 아래와 같이 단위 간격으로 놓여 있다. 사람들은 자신의 위치에서 거리가 이하인 햄버거를 먹을 수 있다.
햄버거 사람 햄버거 사람 햄버거 사람 햄버거 햄버거 사람 사람 햄버거 사람
1 2 3 4 5 6 7 8 9 10 11 12
위의 상태에서
인 경우를 생각해보자. 이 경우 모든 사람은 자신과 인접한 햄버거만 먹을 수 있다. 10번의 위치에 있는 사람은 11번 위치에 있는 햄버거를 먹을 수 있다. 이 경우 다음과 같이 최대 5명의 사람이 햄버거를 먹을 수 있다.
2번 위치에 있는 사람: 1번 위치에 있는 햄버거
4번 위치에 있는 사람: 5번 위치에 있는 햄버거
6번 위치에 있는 사람: 7번 위치에 있는 햄버거
9번 위치에 있는 사람: 8번 위치에 있는 햄버거
10번 위치에 있는 사람: 11번 위치에 있는 햄버거
12번 위치에 있는 사람: 먹을 수 있는 햄버거가 없음
인 경우에는 6명 모두가 햄버거를 먹을 수 있다.
2번 위치에 있는 사람: 1번 위치에 있는 햄버거
4번 위치에 있는 사람: 3번 위치에 있는 햄버거
6번 위치에 있는 사람: 5번 위치에 있는 햄버거
9번 위치에 있는 사람: 7번 위치에 있는 햄버거
10번 위치에 있는 사람: 8번 위치에 있는 햄버거
12번 위치에 있는 사람: 11번 위치에 있는 햄버거
식탁의 길이 , 햄버거를 선택할 수 있는 거리 , 사람과 햄버거의 위치가 주어졌을 때, 햄버거를 먹을 수 있는 사람의 최대 수를 구하는 프로그램을 작성하시오.
첫 줄에 두 정수 과
가 있다. 그리고 다음 줄에 사람과 햄버거의 위치가 문자 P(사람)와 H(햄버거)로 이루어지는 길이
인 문자열로 주어진다.
첫 줄에 햄버거를 먹을 수 있는 최대 사람 수를 나타낸다.
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 로 하면 최대한 많은 사람이 먹을 수 있는 방법이 아니다.
