[Algorithm/JavaScript] Slowest Key

Dico·2020년 10월 26일
0

[Algorithm/JavaScript]

목록 보기
10/18

LeetCode Weekly Contest Question#1 Review 🤓


문제출처: https://leetcode.com/contest/weekly-contest-212/problems/slowest-key/

문제

문제설명

A newly designed keypad was tested, where a tester pressed a sequence of n keys, one at a time.

You are given a string keysPressed of length n, where keysPressed[i] was the ith key pressed in the testing sequence, and a sorted list releaseTimes, where releaseTimes[i] was the time the ith key was released. Both arrays are 0-indexed. The 0th key was pressed at the time 0, and every subsequent key was pressed at the exact time the previous key was released.

The tester wants to know the key of the keypress that had the longest duration. The ith keypress had a duration of releaseTimes[i] - releaseTimes[i - 1], and the 0th keypress had a duration of releaseTimes[0].

Note that the same key could have been pressed multiple times during the test, and these multiple presses of the same key may not have had the same duration.

Return the key of the keypress that had the longest duration. If there are multiple such keypresses, return the lexicographically largest key of the keypresses.

예시

제한사항

  • releaseTimes.length == n
  • keysPressed.length == n
  • 2 <= n <= 1000
  • 0 <= releaseTimes[i] <= 109
  • releaseTimes[i] < releaseTimes[i+1]
  • keysPressed contains only lowercase English letters.

제출답안

//배열에서 가장 긴 duration을 가진 요소를 반환하는 문제
var slowestKey = function(releaseTimes, keysPressed) {
    var duration = [];
    var idx;
    var num = 0; //duration에서 가장 큰 숫자를 담는 변수
    var answer;
    
    //각 요소들의 duration을 배열에 담는다.
    duration.push(releaseTimes[0]);
    for (var i = 1; i < releaseTimes.length; i++){
        duration.push(releaseTimes[i] - releaseTimes[i - 1]);
    }
    
    //duration 배열에서 가장 큰 숫자를 찾고 인덱스(j)로 keysPressed에서 값을 찾아 answer에 담는다.
    for (var j = 0; j < duration.length; j++){
     
        if (duration[j] > num) {      
                num = duration[j];
                answer = keysPressed[j];
            } else if (duration[j] === num) {
                idx = releaseTimes[j] > releaseTimes[j - 1] ? j : j - 1;
                answer = keysPressed[idx];
            }
    }
    
    return answer;
};

오늘의 Lesson

  • 본 문제는 3번의 submit시도 끝에 accepted 되었다.
    첫 시도에서 변수num에 0을 할당하지 않고, 선언만 하였다(var num;). 그리고 두번째 for문 내부이면서 if문이 시작되기 전의 위치에 num = duration[j - 1] || duration[0];라는 코드를 추가해 이전 값이 있으면(즉, 현재 loop의 duration[j]가 duration배열의 가장 첫번째 요소가 아니면) 이전값이 num이 되고, 없는 경우에는 제일 첫번째 요소가 num이 되는 로직을 만들었다.
    하지만 두번째 for문의 목적은 변수 num에 duration배열에서 가장 큰 숫자를 담는 것이므로 매 loop마다duration[j - 1]num을 갱신하는 이 방법으로는 단순히 duration[j]duration[j - 1]를 비교하게 되기 때문에 가장 큰 숫자를 찾을 수가 없다.
  • 따라서 for문 외부에 var num = 0;으로 변수선언과 동시에 초기값을 할당해주었고, loop를 순회하며 if조건문에서 더 큰 숫자를 마주할 때마다 값을 업데이트할 수 있도록 정정했다.
if (duration[j] > num) {      
                num = duration[j];
  ...(이후내용생략)
  • 배열이나 객체에서 모든 요소를 비교해 가장 큰/가장 작은 요소를 찾아햐 할 때는 비교해야할 대상을 정확하게 정의하고 변수에 올바른 값을 저장할 수 있도록 주의해야한다.
profile
프린이의 코묻은 코드가 쌓이는 공간

0개의 댓글