[문제]
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;
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 Lv.2] 미로 탈출 (0) | 2025.05.28 |
---|---|
[프로그래머스 Lv.2] 숫자카드나누기 (0) | 2025.05.27 |
[프로그래머스 Lv.2] 호텔 대실 (0) | 2025.05.26 |
[프로그래머스 Lv.2] 전력망을 둘로 나누기 (0) | 2025.05.26 |
[프로그래머스 Lv.2] 시소 짝궁 (0) | 2025.05.21 |