[문제]

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

 

 

[풀이]

 

단순 구현 문제이다. 문제의 요지를 잘 파악하면 쉽게 풀 수 있다.

 

1. 어느 시간대 이용자가 n x m명 이상, (n + 1) x m명 미만이라면 최소 n대의 증설 서버가 필요

: m이 3이라면, 0 ~ 2명까지는 증설이 필요없고, 3명부터는 증설을 해야한다. 3 ~ 5명은 1대, 6 ~ 8명은 2대, 9 ~ 11명은 3대 이런 식으로 서버가 필요한 것이다.

2. k에 따라 서버 운영 수명이 정해져 있음

: k는 증설 시점으로 부터 k시간 후 회수하는 인자이기 때문에, 서버의 수명이다

 

이 두개만 기억하고 시뮬레이션을 돌리면 된다. 루프 한번은 시간대이다(0~1시간대, 1~2시간대, ..., 23~24시간대). 증설된 서버는 list로 관리하면서, 서버가 증설중인 상태라면 검사를 통해 수명 관리를 실시했다. Time이 k가 되면 list에서 제거하는 것이다.

#include <string>
#include <vector>
#include <list>

using namespace std;

struct Server
{
    int Time = 0;

    bool TimeCheck(int _Limit)
    {
        ++Time;

        if (Time == _Limit)
        {
            return true;
        }

        return false;
    }
};

// m명 늘어날 때마다 서버 1대가 추가
// 어느 시간대의 이용자가 n x m명 이상 (n + 1) x m명 미만 = 최소 n대의 증설된 서버가 운영 중
// 서버는 k시간 동안 운영하고 그 이후에는 반납, k = 5 일 때 10시에 증설한 서버는 10 ~ 15시에만 운영
// 하루 동안 모든 게임 이용자가 게임을 하기 위해 서버를 최소 몇 번 증설해야 하는지 알고 싶습니다. 같은 시간대에 서버를 x대 증설했다면 해당 시간대의 증설 횟수는 x회
int solution(vector<int> players, int m, int k) 
{
    int answer = 0;
    std::list<Server> ServerList;

    for (int i = 0; i < players.size(); i++)
    {
        int CurPlayer = players[i];
        int NeedCount = CurPlayer / m;

        if (ServerList.empty())
        {
            for (int i = 0; i < NeedCount; i++)
            {
                ServerList.push_back({ 0 });
                ++answer;
            }
        }

        if (!ServerList.empty())
        {
            int CurServerCount = ServerList.size();

            if (NeedCount > CurServerCount)
            {
                for (int i = 0; i < NeedCount - CurServerCount; i++)
                {
                    ServerList.push_back({ 0 });
                    ++answer;
                }
            }

            for (auto It = ServerList.begin(); It != ServerList.end();)
            {
                if (It->TimeCheck(k))
                {
                    It = ServerList.erase(It); // erase는 삭제 후 다음 iterator를 반환
                }
                else
                {
                    ++It;
                }
            }
        }
    }

    return answer;
}

+ Recent posts