→ Problems

[Algorithm] 백준 - 27277번 장기자랑 (Swift)

Swift librarian 2024. 3. 22. 17:08

문제

27277번: 장기자랑

실력이 $4, 2, 3, 5, 1, 6$인 순서로 공연하면, 각 병사가 발휘할 수 있는 실력은 순서대로 $4, 0, 1, 2, 0, 5$이므로 실력의 합이 $12$인 채로 공연을 끝마칠 수 있다.

www.acmicpc.net

 
 

문제 풀이

max(0, 현재값-이전값)에서 최대의 효과를 발휘하려면 (현재값-이전값) > 0이고, 그것이 최대로 클 때 최대 효율을 발휘할 수 있다. 예를 들면 [1,2,3,4]가 있다면 [4,1], [3,2]을 짝지어야 최종합 4로 최댓값을 만들 수 있다. 만약 배열이 홀수일 경우 큰 수와 작은 수를 짝지은 후 남은 값을 맨 마지막에 추가해 주면 된다.

import Foundation

var n = Int(readLine()!)!
var skills = readLine()!.split(separator: " ").map{ Int(String($0))! }

func solution(_ n: Int, _ skills: [Int]) -> Int {
    let skills = skills.sorted()
    var answer = [Int]()
    var maxSkill = 0
        
    for i in 0..<n/2 {
        answer.append(skills[n-i-1])
        answer.append(skills[i])
    }
    
    if n % 2 == 1 {
        answer.append(skills[n/2])
    }
        
    for i in 1..<answer.count {
        maxSkill += max(0, answer[i] - answer[i-1])
    }
    
    maxSkill += answer[0]
    
    return maxSkill
}

print(solution(n, skills))