[백준] 햄버거 분배 - Java

RUNGOAT·2023년 4월 15일
0

Algorithm

목록 보기
5/11
post-thumbnail

문제

백준 - 햄버거 분배

📝 풀이

그리디 유형이었으며 햄버거를 먹을 수 있는 최대 인원을 구하는 문제다.
가장 왼쪽에 있는 햄버거를 순차적으로 먹으면 최대 인원을 구할 수 있다.

💻 초기 코드

  • 이중 for문 안에 중복된 코드가 존재한다.
  • leftAte 라는 flag 변수를 사용하지 않고 코드 중복 제거를 위한 리팩토링이 필요해보인다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public 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());
		
		boolean[] isAte = new boolean[N];
		String str = br.readLine();
		
		int answer = 0;
		for (int i = 0; i < N; i++) {
			if (str.charAt(i) == 'P') {
				boolean leftAte = false;
				for (int k = K; k > 0; k--) {
					if (i < k)	continue;
					if (str.charAt(i - k) == 'P') continue;
					if (isAte[i - k])	continue;
					isAte[i - k] = true;
					answer++;
					leftAte = true;
					break;
				}
				if (!leftAte) {
					for (int k = 1; k <= K; k++) {
						if (i + k >= N)	continue;
						if (str.charAt(i + k) == 'P') continue;
						if (isAte[i + k])	continue;
						isAte[i + k] = true;
						answer++;
						break;
					}
				}
			}
		}
		
		System.out.println(answer);
		
	}
	
}

💻 개선된 코드

  • 삼항 연산자를 사용하여 중복을 제거하였다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	
	static int N, K;
	static char[] line;
	
	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());
		line = br.readLine().toCharArray();
		
		int answer = 0;
		for (int i = 0; i < N; i++) {
			if (line[i] == 'P' && isAte(i)) {
				answer++;
			}
		}
		
		System.out.println(answer);
		
	}
	
	static boolean isAte(int index) {
		int start = index - K < 0 ? 0 : index - K;
		int end = index + K < N ? index + K : N-1;
		for (int i = start; i <= end; i++) {
			if (line[i] == 'H') {
				line[i] = 'X';
				return true;
			}
		}
		return false;
	}
	
}
profile
📞피드백 너무나 환영

0개의 댓글