https://school.programmers.co.kr/learn/courses/30/lessons/389479
배열 A에 각 시간대별로 증설한 서버 개수를 담아놓는다고 하자.
(A[0]: 0~1 사이에 증설한 서버 개수)
A[i] : i 시간대에 증설한 서버 개수
players[i] : i 시간대에 게임 유저 수
servers : 동작 중인 서버들이 저장되고, 각 서버의 시간을 저장해놓는다. 서버의 시간이 만료될 경우 제거한다.
nxm <= users < (n+1)xm
에 의하여players[i]
일 때 최소 n = players[i]/m
대의 서버가 요구된다.증설해야할 서버 개수 = (최소 요구 서버 개수)-(기존 동작 서버 개수)
#include <string>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
vector<int> g_players;
vector<int> A; // 시간대 별 증설 서버 개수
vector<int> servers; // 현재 작동 중인 서버를 담는 배열
int g_m;
int g_k;
void push_server(int new_server_count) {
for (int k = 0;k < new_server_count;k++) {
servers.push_back(g_k-1);
}
}
void remove_server() {
vector<int> updated;
for (int i = 0; i < servers.size(); ++i) {
if (servers[i] > 0) {
updated.push_back(servers[i] - 1);
}
}
servers = updated;
}
int solve() {
//0. 변수 초기화
//0.1. A 초기화
A.resize(24, 0);
//1. 각 시간대별 증설 횟수 채우기
//1.0. 0초대 초기화
A[0] = g_players[0] / g_m;
push_server(g_players[0] / g_m);
//1.1. 1~23초대까지
for (int i = 1;i < 24;i++) {
//서버 생명 주기 감소
remove_server();
//최소한 개설되었어야 하는 서버 개수
int n = g_players[i] / g_m;
//현재 서버 개수
int now_server = servers.size();
//최소 서버 개수 - 현재 서버 개수 > 0 -> 증설해야 하는 서버 개수
int new_server= (n - now_server) > 0 ? n - now_server : 0;
A[i] = new_server;
push_server(new_server);
}
//print_A();
//2. A의 총합
int sum = 0;
for (int i = 0;i < A.size();i++) {
sum += A[i];
}
//cout << sum;
return sum;
}
int solution(vector<int> players, int m, int k) {
int answer = 0;
g_players = players;
g_m = m;
g_k = k;
answer = solve();
return answer;
}