Post

[프로그래머스] 서버 증설 횟수 (C++)

[프로그래머스] 서버 증설 횟수 (C++)

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

문제 링크

📝 문제 요약

  • m 명 늘어날때마다 서버 한대 증설

  • 증설된 서버는 k시간 만큼만 운영

  • 증설된 서버가 몇개인지 리턴하면 통과


✅ 코드 설명

1
2
3
int n = 0;
int answer = 0;
queue<vector<int>> servers;
  • n 은 현재 증설된 서버개수를 의미한다.

  • answer 는 이때까지 증설됐던 서버개수 답 제출을 위한 변수.

  • servers{증설된 서버개수, 반납 시간} 으로 이루어진 배열을 여러개 저장하기위한 queue를 선언하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for (int i = 0; i < 24; ++i) {
    if (!servers.empty()) {
        vector<int>& server = servers.front();
        if (server[1] == i) {
            n -= server[0];
            servers.pop();
        }
    }

    int n_need = players[i] / m - n;

    if (n_need > 0) {
        answer += n_need;
        n += n_need;
        servers.push({n_need, i + k});
    }
}
return answer;
  • ii ~ i + 1 시간을 의미하니까 i = 23 까지만 루프

  • servers 가 비어있는지 체크하고, 제일 먼저 빌린 서버 증설내역을 갖고오고

    반납 시간이 다 되었다면 반납해야하는 서버개수 만큼 n 에서 빼고

    servers.pop() 으로 서버 증설내역을 삭제

  • 필요한 서버개수를 players[i] / m - n 으로 구한다.

    i ~ i + 1시간에 접속할 이용자수 / 증설에 필요한 인원 - 현재 서버증설 개수

  • 필요한 서버개수가 0보다 많을경우 nanswer 에 증설 서버개수를 기록하고 서버 증설내역에도 {증설된 서버개수, 반납 시간} 을 추가

  • 루프가 끝나면 0~24시까지 증설했던 서버 총 개수를 담은 answer 를 리턴


전체코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <string>
#include <vector>
#include <queue>

using namespace std;

int solution(vector<int> players, int m, int k) {
    int n = 0;
    int answer = 0;
    queue<vector<int>> servers;

    for (int i = 0; i < 24; ++i) {
        if (!servers.empty()) {
            vector<int>& server = servers.front();
            if (server[1] == i) {
                n -= server[0];
                servers.pop();
            }
        }

        int n_need = players[i] / m - n;

        if (n_need > 0) {
            answer += n_need;
            n += n_need;
            servers.push({n_need, i + k});
        }
    }
    return answer;
}
This post is licensed under CC BY 4.0 by the author.

Trending Tags