package source_code;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 거리가 K 이하인 햄버거를 먹을 수 있음
// 식탁 길이 N, 햄버거 선택 가능 거리 K, 햄버거 먹을 수 있는 사람 최대 수 구하기
// P: 사람, H: 햄버거
public class B_S3_19941_BurgerDistribution {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
int tableLength = Integer.parseInt(input[0]);
int selectLength = Integer.parseInt(input[1]);
char[] table = br.readLine().toCharArray();
int canEatHamburgerCnt = 0;
for (int i = 0; i < tableLength; i++) {
if (table[i] == 'P') {
boolean possibility = calculatePossibility(selectLength, table, i);
if (possibility == true) {
canEatHamburgerCnt++;
}
}
}
System.out.println(canEatHamburgerCnt);
}
// 해당 사람이 햄버거를 먹을 수 있는지 여부 확인
private static boolean calculatePossibility(int selectLength, char[] table, int i) {
int m = 0;
// 왼쪽으로 가면서 정해진 거리 안에서 먹을 수 있는 햄버거가 있는지 체크\
// 왼쪽은 제일 먼 곳부터 탐색
while (selectLength >= m) {
if (i - selectLength + m < 0) {
m++;
continue;
}
if (table[i - selectLength + m] == 'H') {
table[i - selectLength + m] = 'X'; // X로 먹음을 표시
return true;
} else {
m++;
}
}
// 왼쪽에서 햄버거를 못먹었다면 오른쪽 탐색
// 오른쪽은 가까운 곳부터 탐색
m = 1;
while (i + m < table.length && selectLength >= m) {
if (table[i + m] == 'H') {
table[i + m] = 'X';
return true;
} else {
m++;
}
}
return false;
}
}
왼쪽먼저 탐색 후 먹을 햄버거가 없으면 오른쪽을 탐색하는 방법을 택했다.
왼쪽의 경우, 가능한 거리에서 가장 왼쪽부터 탐색을 하고, 오른쪽은 반대로 가장 가까운 곳부터 탐색하도록 했다.
ㄴ 이렇게 해야 최대한 많은 사람이 먹을 수 있음!
calculatePossibility 탐색 방식 개선
왼쪽을 먼 곳부터 탐색하는 로직 -> 보통은 가까운 곳부터 탐색하는게 직관적
반복문 구조도 for문으로 바꾸면 더 깔끔함
private static boolean calculatePossibility(int k, char[] table, int idx) {
// 왼쪽 가까운 곳부터 탐색
for (int i = idx - k; i <= idx + k; i++) {
if (i < 0 || i >= table.length) continue;
if (table[i] == 'H') {
table[i] = 'X';
return true;
}
}
return false;
}
possiblity == true 는 if(possibility)로 간단하게 나타내기
변수 네이밍 통일/ 간결화
package source_code;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class B_S3_19941_BurgerDistribution {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
int n = Integer.parseInt(input[0]);
int k = Integer.parseInt(input[1]);
char[] table = br.readLine().toCharArray();
int count = 0;
for (int i = 0; i < n; i++) {
if (table[i] == 'P' && canEat(table, i, k)) {
count++;
}
}
System.out.println(count);
}
private static boolean canEat(char[] table, int pos, int k) {
for (int i = pos - k; i <= pos + k; i++) {
if (i >= 0 && i < table.length && table[i] == 'H') {
table[i] = 'X';
return true;
}
}
return false;
}
}
-> 굳이 왼쪽 오른쪽 안나누고 범위 기준 for 문으로 가장 왼쪽 인덱스부터 훑어나가면 결국 전체를 탐색 가능했다..!