카테고리 없음

푸드 파이트 대회

148june 2025. 5. 13. 09:22

푸드 파이트 대회 문제

문제 설명

수웅이는 매달 주어진 음식을 빨리 먹는 푸드 파이트 대회를 개최합니다. 이 대회에서 선수들은 1대 1로 대결하며, 매 대결마다 음식의 종류와 양이 바뀝니다. 대결은 준비된 음식들을 일렬로 배치한 뒤, 한 선수는 제일 왼쪽에 있는 음식부터 오른쪽으로, 다른 선수는 제일 오른쪽에 있는 음식부터 왼쪽으로 순서대로 먹는 방식으로 진행됩니다. 중앙에는 물을 배치하고, 물을 먼저 먹는 선수가 승리하게 됩니다.

대회 규칙

  • 두 선수는 같은 종류의 음식을 같은 양만큼 먹어야 하며, 음식의 순서도 같아야 합니다.
  • 칼로리가 낮은 음식을 먼저 먹을 수 있도록 배치합니다.

입력 예시

  • food = [1, 3, 4, 6]"1223330333221"
  • food = [1, 7, 1, 2]"111303111"

문제 해결 과정

입력 배열 설명

  • food[0]: 물의 양 (항상 1)
  • food[1]: 음식 1의 양
  • food[2]: 음식 2의 양
  • food[3]: 음식 3의 양

두 선수의 음식 소비

  1. 음식 1: 7개 → 두 선수는 3개씩 먹을 수 있습니다. (6개 사용 가능, 1개 남음)
  2. 음식 2: 1개 → 두 선수는 0개씩 먹습니다. (사용 불가)
  3. 음식 3: 2개 → 두 선수는 1개씩 먹을 수 있습니다. (모두 사용 가능)

최종 음식 배치

  • 왼쪽 선수: 111 (음식 1) + 1 (음식 3)
  • 중앙: 0 (물)
  • 오른쪽 선수: 111 (음식 1) + 1 (음식 3)

최종 문자열

최종 문자열은 "111303111"입니다.

해설

이 문제는 선수들이 음식을 어떻게 배치하고 소비하는지를 이해하는 것이 핵심입니다. 각 음식의 양을 고려하여 두 선수가 먹을 수 있는 최대량을 계산하고, 이를 바탕으로 음식을 배치해야 합니다.

  • 물은 항상 중앙에 위치하며, 이는 두 선수의 먹는 순서에 따라 배치됩니다.
  • 각 음식의 양을 반으로 나누어, 두 선수가 동일하게 먹을 수 있도록 합니다.
  • 남은 음식은 비워두거나, 사용하지 않도록 합니다.

이러한 과정을 통해 최종적으로 생성된 문자열은 두 선수의 음식 소비를 정확히 반영합니다.

자바 코드 구현

public class FoodFight {
    public String solution(int[] food) {
        StringBuilder left = new StringBuilder();
        StringBuilder right = new StringBuilder();

        // 음식을 배치하기 위한 배열 생성
        for (int i = 1; i < food.length; i++) {
            int count = food[i] / 2; // 두 선수가 먹을 수 있는 최소 양
            for (int j = 0; j < count; j++) {
                left.append(i);  // 왼쪽 선수의 음식
                right.append(i); // 오른쪽 선수의 음식
            }
        }

        // 중앙에 물 추가
        return left.toString() + "0" + right.reverse().toString();
    }

    public static void main(String[] args) {
        FoodFight foodFight = new FoodFight();
        System.out.println(foodFight.solution(new int[]{1, 3, 4, 6})); // "1223330333221"
        System.out.println(foodFight.solution(new int[]{1, 7, 1, 2})); // "111303111"
    }
}