프로그래머스 - 서버 증설 횟수 (Python)

조민수·2025년 5월 26일
0

Programmers

목록 보기
89/90

Lv2, 구현


문제

당신은 온라인 게임을 운영하고 있습니다. 같은 시간대에 게임을 이용하는 사람이 m명 늘어날 때마다 서버 1대가 추가로 필요합니다. 어느 시간대의 이용자가 m명 미만이라면, 서버 증설이 필요하지 않습니다. 어느 시간대의 이용자가 n x m명 이상 (n + 1) x m명 미만이라면 최소 n대의 증설된 서버가 운영 중이어야 합니다. 한 번 증설한 서버는 k시간 동안 운영하고 그 이후에는 반납합니다. 예를 들어, k = 5 일 때 10시에 증설한 서버는 10 ~ 15시에만 운영됩니다.

하루 동안 모든 게임 이용자가 게임을 하기 위해 서버를 최소 몇 번 증설해야 하는지 알고 싶습니다. 같은 시간대에 서버를 x대 증설했다면 해당 시간대의 증설 횟수는 x회입니다.

0시에서 23시까지의 시간대별 게임 이용자의 수를 나타내는 1차원 정수 배열 players, 서버 한 대로 감당할 수 있는 최대 이용자의 수를 나타내는 정수 m, 서버 한 대가 운영 가능한 시간을 나타내는 정수 k가 주어집니다. 이때, 모든 게임 이용자를 감당하기 위한 최소 서버 증설 횟수를 return 하도록 solution을 완성해 주세요.


풀이

  • 0시부터 23시까지 진행하면서,
    players[i] // m 즉, 현재 시간에 필요한 최소한의 서버 수를 구한다.
  • 현재 살아있는 서버의 수가 needs보다 많다면 증설이 필요없다.
  • 증설이 필요하다면, 부족한 서버 수 만큼 answer에 더하고 증설한다.
  • 증설된 서버의 수명(만료시간)을 server 리스트에 추가한다.
def solution(players, m, k):
    answer = 0
    # server: 각 개별 서버가 만료되는 시간
    # k=5, 2시에 서버가 증설 → 2,3,4,5,6시 운영되고 7시 만료
    # 해당 서버의 만료 시간인 '7'이 저장
    server = []

    for i in range(len(players)):    # i = 현재 시간
        needs = players[i] // m      # 지금 필요한 총 서버 수

        active_now = 0               # 현재 운영중인 서버 수
        still_active = []            # 현재 시간에도 살아있는 서버들의 만료 시간
        
        for expire in server:
            if i < expire:             # 현재 시간이 서버 만료 시간 이전이면, 서버는 아직 운영 중
                active_now += 1
                still_active.append(expire)
        server = still_active               # 운영 중인 서버 목록으로 최신화

        plus = 0                            # 이번 시간에 증설할 서버 수
        if active_now < needs:              # 필요한 서버보다 현재 운영 중인 서버가 적다면
            plus = needs - active_now       # 부족한 만큼 증설

        if plus > 0:                        # 증설할 서버가 있다면
            answer += plus                  # 총 증설 횟수에 더함
            for _ in range(plus):
                server.append(i + k)        # 현재 시간 i에 증설된 서버는 (i + k) 시간에 만료

    return answer

주석을 cursor를 통해 달았는데, 개인적으로 만족스럽다.
변수명도 함께 바꿔준다.

profile
Being a Modern Software Engineer

0개의 댓글