문제

https://leetcode.com/problems/minimum-number-of-pushes-to-type-word-i

풀이

휴대전화의 2에서 8까지의 숫자에 문자를 배치할 수 있고, 2개 이상의 수가 배치되었을 땐 여러번 눌러야 뒤에 있는 숫자를 타이핑 할 수 있다. 스트링 word가 주어졌을 때, 버튼을 가장 적게 눌러 word를 타이핑 했을 때의 타이핑 수를 리턴하면 된다.

각 키의 첫 번째 문자는 1번, 두 번째는 2번… 눌러야 하므로 많이 등장하는 문자일수록 누름 횟수가 적은 앞자리에 배치해야 한다.

빈도수 내림차순 정렬 후, 인덱스를 8로 나눈 몫 + 1이 해당 문자의 누름 횟수가 된다.

  • index 0 - 7 → 1번
  • index 8 - 15 → 2번
  • index 16 - 23 → 3번

코드

class Solution {
    func minimumPushes(_ word: String) -> Int {
        var frequencies = [Character: Int]()
        for char in word {
            frequencies[char, default: 0] += 1
        }
        
        return frequencies.values
            .sorted { $0 > $1 }
            .enumerated()
            .reduce(0) { $0 + ($1.offset / 8 + 1) * $1.element }
    }
}