Algorithm

[프로그래머스] 푸드 파이트 대회

요영 2022. 11. 9. 20:21

1) 문제

https://school.programmers.co.kr/learn/courses/30/lessons/134240

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

입출력 예
food result
[1, 3, 4, 6] "1223330333221"
[1, 7, 1, 2] "111303111"

2) 풀이

레벨 1의 간단한 문제였다.
문제에는 사용하지 못하는 음식에 대한 설명이 있지만 굳이 고려할 필요는 없는 요소였다.
단순히 해당 칼로리(인덱스)의 개수를 2로 나눠 반복해서 answer에 append 시켜주면 해결된다.

3) 코드

string solution(vector<int> food) {
    string answer = "";

    // while 반복문
    // 1부터 증가해서 it이 size-1과 같아지면 '0' 추가하고 감소시작
    // it이 0이 되면 종료
    int it=1;
    bool sign = true;
    while (it > 0) {
        int limit = food.size();
        if (it == limit) {
            answer += "0";
            --it;
            sign = false;
        }
        if (sign) {
            for(int i=0; i<food[it]/2; i++) {
                answer += to_string(it);
            }

            ++it;
        }
        if (!sign) {
            for(int i=0; i<food[it]/2; i++) {
                answer += to_string(it);
            }
            --it;
        }
    }
    return answer;
}

4) 고찰

food vector의 길이가 9였기 때문에 그냥 아무 생각없이 vector를 왕복했는데
생각해보니 0을 기준으로 같은 순서기 때문에 한 번만 돌고
0을 append하고 reverse해서 붙였어도 되었다.