백준 19941 햄버거 분배 | 실버 3

Bluewave·2025년 7월 27일

코테공부_java

목록 보기
94/99
post-thumbnail

☁️ 문제 바로가기

나의 코드

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 == trueif(possibility)로 간단하게 나타내기

  • 변수 네이밍 통일/ 간결화

    • canEatHamburgerCnt -> result or count도 자주 씀

리팩토링 코드

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 문으로 가장 왼쪽 인덱스부터 훑어나가면 결국 전체를 탐색 가능했다..!

profile
Developer's Logbook

0개의 댓글