알고리즘/프로그래머스 1단계

프로그래머스 - 푸드 파이트 대회 - C++

게임만드는학생 2024. 7. 16. 14:49

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

#include <string>
#include <vector>

using namespace std;

string solution(vector<int> food) {
    string answer = "";
    
    vector<int>a;
    vector<int>b;
    for(int i=1;i<food.size();i++)
    {
        if(food[i]>1)
        {
            a.push_back(food[i]/2);
            b.push_back(i);
        }
    }
    
    for(int i=0;i<a.size();i++)
    {
        for(int j=0;j<a[i];j++)
        {
            answer+=(b[i])+'0';
        }
    }
    answer+='0';
    for(int i=answer.length()-2;i>=0;i--)
        answer+=answer[i];
    return answer;
}

 

주어진 food 배열은 0번이 물을 뜻하며 항상 1, 그 다음부터 음식의 개수를 뜻한다. 

food[1] = 3 이라면 1번음식이 3개라는 뜻이다. 

그렇다면 각 선수가 1개씩 먹을수 있다. 

그래서 answer에 답을 찾기위한 사전 준비로 벡터 a,b를 준비한다. 

 

값이 1이상이어야  두명이 먹을수있기 때문에 1이상일 경우 벡터 a에 한 명이 먹을 개수를 b에 몇번 음식인지를 저장한다. 

 

a의 크기만큼 반복문을 돌리며 한 선수의 음식순서를 저장한다. 

a크기는 한 선수가 몇개의 종류의 음식을 먹을지를 나타낸다. 또 a[i]는 그 음식이 몇개인지를 뜻한다. 

따라서 a[i]번만큼 다시 반복문을 돌며 answer에 문자를 추가한다. 이 때, 저장은 몇번 음식인지를 나타내야하기 때문에

b벡터의 값을 저장한다. 

이렇게 한 선수에 대한 음식을 저장하면 그 후, 물을 뜻하는 0을 저장하고 

음식을 반대 순서로 다시 저장한다.