PS/문제 풀이

[프로그래머스/Swift] 389479번 - 서버 증설 횟수

시르베어 2025. 3. 28. 10:27

🔗 문제 링크

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

💡 구현 아이디어

  1. 증설 이용시간 확인 - 종료된 서버가 있는지
  2. 최대 이용가능 사용자 수 확인
  3. 이용가능 수 > 사용자 수 ⇒ 문제 없음
  4. 이용가능 수 ≤ 사용자 수 ⇒ 서버증설, 결과 저장
  5. 결과 반환

💻 코드

// 시간대의 유저수, 한서버의 유저수, 서버의 유지시간
func solution(_ players:[Int], _ m:Int, _ k:Int) -> Int {
    var result1: Int = 0 // 서버 증설 횟수
    var servers: [(Int, Int)] = [] // (서버가 종료되는 시간, 서버 개수)
    
    for H in 0..<24 {
        // 이용시간이 종료된 서버가 있는지 확인
        
        for (idx, server) in servers.enumerated() {
            if server.0 == H { // 이번에 종료됨
                servers.removeFirst() // 종료는 앞에서 부터 종료됨
            }
        }
        
        // 최대 이용가능한 유저 수 (기본 한개 + 추가 서버)
        var maxUsers: Int = m
        for server in servers {
            maxUsers += server.1 * m
        }
        
        // 서버 증설이 필요
        if players[H] >= maxUsers {
            // maxUsers 미만까지 입장가능 : 남은 유저수 = 전체 - (max-1)
            let leftUsers: Int = players[H] - (maxUsers-1)
            
            
            // 서버 증설
            if leftUsers % m == 0 { 
                result1 += leftUsers / m 
                servers.append((H+k, leftUsers/m))
            } else {
                result1 += leftUsers / m + 1
                servers.append((H+k, leftUsers/m+1))
            }
        }
    }
    return result1
}

❌ 틀린 이유 및 틀린 부분

  • 제출 했더니 런타임 에러가 떴다 - 아무리 찾아도 문제가 없어 다시 제출했더니 통과했다, 시스템 오류 였던듯하다

⏳ 시간 복잡도

  • 최대 24(시간) * 24(서버증설한시간)
  • O(n^2)

📌 풀이 또는 기억할 정보