당신은 온라인 게임을 운영하고 있습니다. 같은 시간대에 게임을 이용하는 사람이 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을 완성해 주세요.
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를 통해 달았는데, 개인적으로 만족스럽다.
변수명도 함께 바꿔준다.