본문 바로가기
알고리즘 문제풀이

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

by SiO2whocode 2025. 5. 9.

https://school.programmers.co.kr/learn/courses/30/lessons/389479?language=swift

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

시뮬레이션

 

사담 시작 > 오랜만에 풀어서 그런지 재밌다 (?) 개인적으로 시뮬레이션(특히 시간 나오는)에 약하다고 생각하는데, 이번 문제는 그래도 스스로 잘 풀어서 다행 시뮬레이션 거부감 멈춰

사담 끝 <

 

매 시간 접속중인 사용자 수가 주어지고, 서버 한 대 당 수용할 수 있는 인원인 m, 서버 한 대의 지속시간 k가 주어진다.

이때, 사용자수가 현재 작동중인 서버들의 수용인원을 넘으면 필요한 만큼 서버를 증설해야하는데,

매시간 모든 접속자가 이용할 수 있도록 하려면 서버를 총 몇 대 증설해야하는지 반환하는 문제

처음 시작할 때는 서버 한대 구동중

 

접근방법

Server라는 클래스를 만들어서 time 프로퍼티를 갖게 했다.(time 값을 매번 바꿔줘야 돼서 struct 대신 class사용)

현재 작동중인 서버들을 배열로 모아두려고 했다.

그리고 players (매시간 접속 사용자수 배열)을 순회하면서, 각 시간에 필요한 서버 수를 구하고, 현재 구동중인 서버수를 뺀 새로 증설이 필요한 서버수를 구해서 총 증설 횟수에 더했다.

그리고 for문 내 마지막 부분에는 시간이 1초 흐른 처리를 해주려고

현재 구동중인 서버의 time 변수를 1 증가시키고, removeAll 메서드 써서 time이 k이상인 서버들은 현재 구동중인 서버에서 제거했다.

 

최종적으로 총 증설횟수 반환하면 끝!

 

오답노트

증설이 필요한 서버 수 구하는 데, 좀 헷갈려서 코드를 여러번 고쳐썼다.

우선 주의했어야 했던 점은

- 맨 처음에 구동중인 서버가 1대 있다는 점

이거 때문에 5대 필요하고 m이 3일 때, 2대가 필요한게 아니라 1대가 필요함 (나머지 연산해서 계산해보려고 했는데 그냥 나누기만 하면 되는거였음)

 

소스코드

import Foundation

class Server {
    var time:Int = 0
}

func solution(_ players:[Int], _ m:Int, _ k:Int) -> Int {
    
    var curServers:[Server] = []
    var result:Int = 0
    
    for s in 0..<players.count {
        
        let player = players[s]
        let realNeedServers = player/m - curServers.count
        if realNeedServers > 0 {
            // 증설 필요함
            for newServer in 0..<realNeedServers {
                curServers.append(Server())
            }
            result += realNeedServers
        }
        
        // 시간 반영
        curServers.forEach { $0.time += 1 }
        
        curServers.removeAll { $0.time >= k }       
    }
    
    return result
}
728x90