본문 바로가기
프로그래머스 코딩테스트 문제/Level 1

[프로그래머스] - 푸드 파이트 대회(C#)

by jyppro 2023. 8. 29.

푸드 파이트 대회

오늘은 "푸드 파이트 대회" 문제를 풀어보도록 하겠습니다. 바로 문제를 살펴보겠습니다.

 

문제 설명

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

이때, 대회의 공정성을 위해 두 선수가 먹는 음식의 종류와 양이 같아야 하며, 음식을 먹는 순서도 같아야 합니다. 또한, 이번 대회부터는 칼로리가 낮은 음식을 먼저 먹을 수 있게 배치하여 선수들이 음식을 더 잘 먹을 수 있게 하려고 합니다. 이번 대회를 위해 수웅이는 음식을 주문했는데, 대회의 조건을 고려하지 않고 음식을 주문하여 몇 개의 음식은 대회에 사용하지 못하게 되었습니다.

예를 들어, 3가지의 음식이 준비되어 있으며, 칼로리가 적은 순서대로 1번 음식을 3개, 2번 음식을 4개, 3번 음식을 6개 준비했으며, 물을 편의상 0번 음식이라고 칭한다면, 두 선수는 1번 음식 1개, 2번 음식 2개, 3번 음식 3개씩을 먹게 되므로 음식의 배치는 "1223330333221"이 됩니다. 따라서 1번 음식 1개는 대회에 사용하지 못합니다.

수웅이가 준비한 음식의 양을 칼로리가 적은 순서대로 나타내는 정수 배열 food가 주어졌을 때, 대회를 위한 음식의 배치를 나타내는 문자열을 return 하는 solution 함수를 완성해주세요.

 

제한 사항

  • 2 ≤ food의 길이 ≤ 9
  • 1 ≤ food의 각 원소 ≤ 1,000
  • food에는 칼로리가 적은 순서대로 음식의 양이 담겨 있습니다.
  • food[i]는 i번 음식의 수입니다.
  • food[0]은 수웅이가 준비한 물의 양이며, 항상 1입니다.
  • 정답의 길이가 3 이상인 경우만 입력으로 주어집니다.

 

입출력 예

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

 

입출력 예 설명

입출력 예 #1
문제 예시와 같습니다.


입출력 예 #2
두 선수는 1번 음식 3개, 3번 음식 1개를 먹게 되므로 음식의 배치는 "111303111"입니다.

 

시작 코드

using System;

public class Solution {
    public string solution(int[] food) {
        string answer = "";
        return answer;
    }
}

 

나의 풀이

using System;
using System.Linq;

public class Solution {
    public string solution(int[] food) {
       string answer = "";
        string str = "";
        
        for(int i = 1; i < food.Length; i++)
        {
            for(int j = 0; j < food[i] / 2; j++)
            {
                answer += i.ToString();
            }
        }
        str = String.Concat(answer.Reverse());
        return answer + "0" + str;
    }
}

 

코드 분석

int형 배열 food가 주어지면서 코드가 시작됩니다. using 지시문으로 Linq를 사용하고 string타입의 str를 선언해줍니다.

이중for문을 작성하여 첫번째는 i = 1부터 food의 길이까지 돌립니다. 두번째는 j = 0부터 food[i]를 2로 나눈 길이만큼 돌립니다. 그 안에 answer에 i.ToString()을 추가해 줍니다. for문을 빠져나오면 str에 String.Concat으로 answer를 뒤집은 값을 넣어줍니다. 최종적으로 answer와 문자 "0" 그리고 str을 더한 값을 리턴해줍니다.

 

풀이 설명

우선 문제를 살펴보면 상당히 내용이 많습니다. 제한사항도 꽤 긴데, 문제에서 원하는 것은 두 선수가 양쪽에서 같은 종류와 양의 음식을 먹는 대회음식을 세팅 하는 것입니다. 이러한 조건 때문에 홀수의 양을 가지는 음식은 세팅에 포함되지 않습니다. 그리고 가운데는 0으로 물을 나타냅니다. 이중for문을 자주 사용하는데 첫 for문을 거쳐서 나오는 food[i]를 두번째 for문에서 2로 나눈만큼의 for문을 돌립니다. 예시로 살펴보면 더 알아보기 쉬우니 한번 대입해 보겠습니다.

 

food로 [1, 3, 4, 6]이 들어오면 첫 for문을 1부터 4까지 돌립니다. 두번째 for문에 처음 들어가면 food[i]는 food[1]이고 1입니다. 1을 2로 나누면 1이므로 두번째 for문은 0부터 1까지 돕니다. 그럼 한번 돌아가게 되고 answer에는 "1"이 들어가게 됩니다. 이 과정을 나머지 food배열의 원소들도 전부 돌려주면 answer가 완성되고 for문을 빠져나간 뒤에 answer와 answer를 뒤집은 str을 0을 중간에 두고 이어주면 정답이 완성됩니다.

 

<NEXT>

오늘은 "푸드 파이터 대회" 문제를 풀어보았습니다. 다음에는 "콜라 문제" 문제를 다뤄보겠습니다. 감사합니다.