1629. Slowest Key (가장 느린 키)
새로 설계된 키패드를 테스트하여 테스터가 한 번에 하나씩 n개의 키 시퀀스를 누릅니다.
테스트 시퀀스에서 keysPressed[i]가 i번째 키를 누른 길이 n의 문자열 키와 releaseTimes[i]가 i번째 키가 해제된 시간인 정렬된 목록 릴리스 타임이 주어집니다. 두 배열 모두 0-indexed입니다. 0번째 키는 0 시점에 눌렀으며, 이후의 모든 키는 이전 키가 해제된 정확한 시점에 누릅니다.
테스터가 가장 길게 누른 키를 알고 싶어합니다. i번째 키프레스는 releaseTimes[i] - releaseTimes[i - 1]의 지속 시간을 가졌고, 0번째 키프레스는 releaseTimes[0]의 지속 시간을 가졌습니다.
테스트 중에 동일한 키를 여러 번 눌렀을 수 있으며, 동일한 키를 여러 번 눌렀을 때 지속 시간이 동일하지 않았을 수도 있습니다.
가장 길게 누른 키를 반환합니다. 이러한 키 누름이 여러 개인 경우 사전적으로 가장 큰 키를 반환합니다.
예시 1:
입력: releaseTimes = [9,29,49,50], keysPressed = "cbcd"
출력: "c"
설명: 키 누름은 다음과 같습니다:
'c'에 대한 키 누름은 지속 시간이 9였습니다(시간 0에서 눌렀다가 시간 9에서 뗐음).
'b'에 대한 키 누름은 지속 시간이 29 - 9 = 20이었습니다(이전 문자를 놓은 직후 시간 9에서 눌렀다가 시간 29에서 뗐음).
'c'에 대한 키 누름은 지속 시간이 49 - 29 = 20이었습니다(이전 문자를 놓은 직후 시간 29에서 눌렀다가 시간 49에서 뗐음).
'd'에 대한 키 누름은 지속 시간이 50 - 49 = 1이었습니다(이전 문자를 놓은 직후 시간 49에서 눌렀다가 시간 50에서 뗐음).
이 중 가장 긴 키 입력은 'b'를 누르는 것이었고, 두 번째 키 입력은 'c'였으며, 두 키 모두 지속 시간이 20이었습니다.
'c'는 사전적으로 'b'보다 크므로 답은 'c'입니다.
예시 2:
입력: releaseTimes = [12,23,36,46,62], keysPressed = "spuda"
출력: "a"
설명: 키 누름은 다음과 같습니다.
's'에 대한 키 누름은 지속 시간이 12였습니다.
'p'에 대한 키 누름은 지속 시간이 23 - 12 = 11이었습니다.
'u'에 대한 키 누름은 지속 시간이 36 - 23 = 13이었습니다.
'd'에 대한 키 누름은 지속 시간이 46 - 36 = 10이었습니다.
'a'에 대한 키 누름은 지속 시간이 62 - 46 = 16이었습니다
. 이 중 가장 긴 키 누름은 지속 시간이 16인 'a' 키 누름이었습니다.
조건:
- releaseTimes.length == n
- keysPressed.length == n
- 2 <= n <= 1000
- 1 <= releaseTimes[i] <= 10^9
- releaseTimes[i] < releaseTimes[i+1]
- keysPressed소문자 영어 글자만 포함합니다.
정답:
public class Solution {
public char SlowestKey(int[] releaseTimes, string keysPressed) {
List<Tuple<char, int>> resultTuple = new List<Tuple<char, int>>();
resultTuple.Add(new Tuple<char, int>(keysPressed[0], releaseTimes[0]));
for (int i = 1; i < releaseTimes.Length; i++)
{
resultTuple.Add(new Tuple<char, int>(keysPressed[i], releaseTimes[i] - releaseTimes[i - 1]));
}
int maxCount = resultTuple.Count(n => n.Item2 == resultTuple.Select(n => n.Item2).ToList().Max());
resultTuple = new List<Tuple<char, int>>(resultTuple.OrderByDescending(n => n.Item2));
resultTuple.RemoveRange( maxCount, resultTuple.Count - maxCount);
resultTuple = new List<Tuple<char, int>>(resultTuple.OrderByDescending(n => n.Item1));
return resultTuple[0].Item1;
}
}
해설: 가장 처음 눌렀을 때는 바로 시작이므로 미리 넣어 준 후 해당 키에 맞는 keysPressed와 releaseTimes, 즉 누른 시간을 대입해 넣어줍니다.
for내에서는 키와 누른 시간을 계산하여 넣은 후 누른 시간을 기준으로 내림차순 정렬합니다.
정렬했을 때 누른 시간이 가장 긴 키만 남기기 위하여 갯수를 찾은 후 RemoveRange를 이용하여 잘라줍니다.
자른 후 사전적으로 가장 큰 키를 넘겨주어야하므로 키를 기준으로 내림차순 정렬하고 가장 첫번째 있는 키를 return해줍니다.