# Max Min ### jm ```swift // Complete the maxMin function below. func maxMin(k: Int, arr: [Int]) -> Int { // 응 개쉬워~ // 하지만 예외를 잘 생각해야함. // 무조건 맨앞에 k개를 뽑는 게 아님. // 맨앞 k개 보다 중간에 있는 k개의 차이가 더 적을 수 있음 // [0, 1, 10] [11, 12, 13] // 10 > 2 var arrOrdered = arr.sorted() // 오름차순 var min = arrOrdered[arr.count-1] for index in 0...arrOrdered.count - k { // 여기서 마지막꺼 포함되도록 범위 잘 설정해야함. let gap = arrOrdered[k - 1 + index] - arrOrdered[index] if min > gap { min = gap } } return min } ``` ### woongs ```swift func maxMin(k: Int, arr: [Int]) -> Int { let ordered = arr.sorted() var unfairness = Int.max for i in k...arr.count { let target = ordered[i-k..<i] unfairness = min(target.last! - target.first!, unfairness) } return unfairness } ``` # Greedy Florist ### jm ```swift // Complete the getMinimumCost function below. func getMinimumCost(k: Int, c: [Int]) -> Int { // 9 7 5 3 1 // 1*9 + 1*7 + 1* 5 / 2*3 + 2*1 var orderedCosts = c.sorted(by: >) // 내림차순 var sumOfCosts = 0 for index in 0..<c.count { let factor = index / k + 1 sumOfCosts += orderedCosts[index] * factor } return sumOfCosts } ``` ### JH ```swift // Complete the getMinimumCost function below. func getMinimumCost(k: Int, c: [Int]) -> Int { var tempK = k var multi = 1 var answer = 0 c.sorted(by: >).forEach { answer += multi * $0 tempK -= 1 if tempK == 0 { tempK = k multi += 1 } } return answer } ``` ### SMK ```swift // Complete the getMinimumCost function below. func getMinimumCost(k: Int, c: [Int]) -> Int { return c.sorted(by: >) .enumerated() .map { (($0/k)+1) * $1 } .reduce(0, +) } ``` ### woongs ```swift func getMinimumCost(k: Int, c: [Int]) -> Int { var before = 0 var canBuy = k var total = 0 for flo in c.sorted(by: >) { total += (before + 1) * flo if canBuy-1 == 0 { canBuy = k before += 1 } else { canBuy -= 1 } } return total } ``` # Luck Balance ### jm ```swift func luckBalance(k: Int, contests: [[Int]]) -> Int { // 중요한 contest는 k개까지 질 수 있다. - 이 결과 luck 합이 최대여야 한다. // luck의 크기가 최소인 contest를 이기면 된다. // 중요도가 0인 contest는 무조건 지면 된다. // 애먹었던것들 // 진 거는 빼줘야 한다. // k가 importantContests.count보다 클 수 있다. var sumOfLuck = 0 var noImportantContests = contests .filter { $0[1] != 1 } // O(n) var importantContests = contests .filter { $0[1] == 1 } .sorted { $0[0] > $1[0] } // O(n) if k <= importantContests.count { for index in (0..<k) { sumOfLuck += importantContests.removeFirst()[0] } } else { sumOfLuck += importantContests.reduce(0) { $0 + $1[0] } importantContests = [] } return sumOfLuck + noImportantContests.reduce(0) { $0 + $1[0] } - importantContests.reduce(0) { $0 + $1[0] } } ``` ### JH ```swift // Complete the luckBalance function below. func luckBalance(k: Int, contests: [[Int]]) -> Int { let sorted = contests.sorted { lhs, rhs in return lhs[0] > rhs[0] } var tempK = k var answer = 0 sorted.forEach { contest in if contest[1] == 0 { answer += contest[0] } else { if tempK == 0 { answer -= contest[0] } else { tempK -= 1 answer += contest[0] } } } return answer } ``` ### SMK ```swift // Complete the luckBalance function below. func luckBalance(k: Int, contests: [[Int]]) -> Int { var lucks = [Int]() var luckBalance = 0 contests.forEach { guard $0[1] == 1 else { luckBalance += $0[0] return } lucks.append($0[0]) } lucks = lucks.sorted() if lucks.count < k { luckBalance += lucks.reduce(0, +) } else { luckBalance += lucks.suffix(k).reduce(0, +) luckBalance -= lucks.prefix(lucks.count-k).reduce(0, +) } return luckBalance } ``` ### woongs ```swift func luckBalance(k: Int, contests: [[Int]]) -> Int { let ordered = contests.sorted(by: { $0[0] > $1[0] }) var saving = k var luck = 0 for cont in ordered { guard cont[1] == 1 else { luck += cont[0] continue } if saving == 0 { luck -= cont[0] } else { luck += cont[0] saving -= 1 } } return luck } ``` # Minimum Absolute Difference in an Array ### jm ```swift func minimumAbsoluteDifference(arr: [Int]) -> Int { // 차이의 절대값은 좌표상 거리다. // 오름차순 정렬 후, 바로 옆에 근접한 아이끼리의 차이만 구하면 된다. // a b c (a < b < c )일 때, 항상 |a - c| > |a - b| 를 만족하기 때문! // 그래서 그리디구나! let sortedArr = arr.sorted() var diffSet = Set([Int]()) for index in (1..<sortedArr.count) { diffSet.insert(abs(sortedArr[index-1] - sortedArr[index])) } return diffSet.min()! }