백준 햄버거 분배

KIMYEONGJUN·2024년 5월 31일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

식탁의 길이 N, 햄버거 선택할 수 있는 거리 K
첫 줄에 두 정수 N과 K가 있다.
그리고 다음 줄에 사람과 햄버거의 위치가 문자 P(사람)와 H(햄버거)로 이루어지는 길이 N인 문자열로 주어진다.
첫 줄에 햄버거를 먹을 수 있는 최대 사람 수를 나타낸다

내가 이 문제를 보고 생각해본 부분

입력된 정보를 저장한다.
사람이 햄버거를 먹는 최적의 경우를 탐색한다.
햄버거를 먹은 인원을 결과로 출력한다.

코드로 구현

package baekjoon.baekjoon_19;

import java.io.*;
import java.util.StringTokenizer;

// 백준 19941번 문제
public class Main669 {
    static char[] info;	//식탁 정보 저장 배열
    static int answer = 0;	//먹은 인원수 저장 변수
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());
        info = br.readLine().toCharArray();		//식탁 정보 배열 형태로 저장

        //식탁 정보 탐색
        for(int i = 0; i < N; i++){
            if(info[i] == 'P'){		//사람일 때 먹을 수있는 햄버거 탐색
                int index = Math.max(i - K, 0);
                boolean check = false;
                //먹을 수 있는 햄버거 왼쪽 범위 탐색
                //가장 먼저 발견한 햄버거가 범위 왼쪽에 가장 가까운 햄버거!
                for(int j = index; j < i; j++){
                    if(bergerCheck(j)){	//먹을 수 있는 햄버거 발견
                        check = true;
                        break;
                    }
                }
                //먹을 수 있는 햄버거 오른쪽 범위 탐색
                if(!check){
                    index = i + K >= N ? N-1 : i + K;
                    for(int j = i + 1; j <= index; j++){
                        if(bergerCheck(j))	//먹을 수 있는 햄버거 발견
                            break;
                    }
                }
            }
        }
        bw.write(answer + "");	//햄버거 먹은 인원수 BufferedWriter 저장
        bw.flush();		//결과 출력
        bw.close();
        br.close();
    }

    //범위 탐색할 때 먹을 수 있는 햄버거인지 확인하는 함수
    static boolean bergerCheck(int index){
        if(info[index] == 'H'){		//햄버거가 맞을 때
            info[index] = 'X';	//햄버거 먹었기 때문에 'X'로 변경
            answer++;		//먹은 인원수 증가!
            return true;	//먹기 성공 True
        }
        return false;		//먹기 실패 False
    }
}

마무리

하루하루 계속 문제를 풀면서 어려웠던 점은 전반적을 어떻게 코드를 작성하고 작되는지 감이 안왔었다 그부분이 조금 어렵게 느껴졌다

profile
Junior backend developer

0개의 댓글