Back to all solutions

#2268 - Minimum Number of Keypresses

Problem Description

You have a keypad with 9 buttons, numbered from 1 to 9, each mapped to lowercase English letters. You can choose which characters each button is matched to as long as:

  • All 26 lowercase English letters are mapped to.
  • Each character is mapped to by exactly 1 button.
  • Each button maps to at most 3 characters.

To type the first character matched to a button, you press the button once. To type the second character, you press the button twice, and so on.

Given a string s, return the minimum number of keypresses needed to type s using your keypad.

Note that the characters mapped to by each button, and the order they are mapped in cannot be changed.

Solution

/**
 * @param {string} s
 * @return {number}
 */
var minimumKeypresses = function(s) {
  const frequency = new Map();
  for (const char of s) {
    frequency.set(char, (frequency.get(char) || 0) + 1);
  }

  const frequencies = Array.from(frequency.values()).sort((a, b) => b - a);

  let keypresses = 0;
  for (let i = 0; i < frequencies.length; i++) {
    const pressesPerChar = Math.floor(i / 9) + 1;
    keypresses += frequencies[i] * pressesPerChar;
  }

  return keypresses;
};