[프로그래머스] 서버 증설 횟수

mmnono·2025년 4월 13일
0

알고리즘

목록 보기
9/10

문제

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

풀이

배열 A에 각 시간대별로 증설한 서버 개수를 담아놓는다고 하자.
(A[0]: 0~1 사이에 증설한 서버 개수)
A[i] : i 시간대에 증설한 서버 개수
players[i] : i 시간대에 게임 유저 수
servers : 동작 중인 서버들이 저장되고, 각 서버의 시간을 저장해놓는다. 서버의 시간이 만료될 경우 제거한다.

  1. 기존 동작 서버 시간 감소
    • 다운되어야 하는 서버는 다운을 시켜놓아야 계산에 영향이 가지 않는다.
  2. 증설해야하는 서버 계산
    • nxm <= users < (n+1)xm 에 의하여
      players[i]일 때 최소 n = players[i]/m 대의 서버가 요구된다.
    • 증설해야할 서버 개수 = (최소 요구 서버 개수)-(기존 동작 서버 개수)
      이때 증설해야할 서버 개수는 0보다 커야 한다.
      (0보다 작을 경우 기존 동작 서버들로 커버가 가능한 유저수이기 때문에)
    • 계산한 서버 개수는 A[i]에 할당한다.
  3. 1~2번을 반복하며 A 배열의 23번까지 모두 채웠다면 A의 총합을 구하면 된다.

코드

#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;
}

0개의 댓글