본문 바로가기

Java/Java 알고리즘 LeetCode

[LeetCode- Part. 3] 3. 가장 느린 키 (+ 초기값 이용, arr[i]-arr[i-1])

반응형

https://leetcode.com/problems/slowest-key/submissions/

 

Slowest Key - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

1. 문자의 경우 대소 비교가 가능하다.

-> 누르는 시간이 같을 경우 사전순으로 더 큰 키 선택

2. 동일한 문자가 여러번 등장할 수 있으므로 해시맵 사용

 

class Solution {
    public char slowestKey(int[] releaseTimes, String keysPressed) {
        //0초 부터 시작
        char[] arr = keysPressed.toCharArray();
        int n=releaseTimes.length;
        Map<Character, Integer> map = new HashMap<>();
        
        int answer=0;
        char ch=' ';
        int cnt=0;
        for(int i=0;i<n;i++){
            if(!map.containsKey(arr[i])){
                //System.out.println("Not contains");
                map.put(arr[i], releaseTimes[i]-answer);
            }
            else {
                //System.out.println("contains");
                if(map.get(arr[i])<releaseTimes[i]-answer){
                    map.put(arr[i], releaseTimes[i]-answer);
                }
            }
            answer=releaseTimes[i];
            //System.out.println(answer);
        }
        int result=Integer.MIN_VALUE;
        for(char x: map.keySet()){
            if(map.get(x)>result) {
                result=map.get(x);
                ch=x;
            }
            if(map.get(x)==result &&ch<x){
                    ch=x;
            }
        }
        return ch;
    }
}

 

 

+) 세련된 풀이

-> 해시맵을 사용하지 않은 풀이

: 동일한 문자가 나오는 것과 관계없이 누른 시간이 같을 경우에 사전순서 확인하면 된다.

class Solution {
    public char slowestKey(int[] releaseTimes, String keysPressed) {
        //1. ds
        int n=releaseTimes.length;
        //초기값 설정
        int max=releaseTimes[0];
        char c = keysPressed.charAt(0);
        
        //2. loop
        //초기값을 설정했기 때문에 1부터 시작
        for(int i=1; i<n;i++){
            //누른 시간 구하기
            int diff=releaseTimes[i]-releaseTimes[i-1];
            
            //누른 시간 갱신해 더 긴 시간 존재시 변경하는데, 같을 경우엔 사전적으로 더 클 때만 변경
            if(diff > max || (diff==max && keysPressed.charAt(i) >c)){
                max=diff;
                c=keysPressed.charAt(i);
            }
        }
        return c;
    }
}

 


 

class Solution {
    public char slowestKey(int[] releaseTimes, String keysPressed) {
        char answer = ' ';
        int time=0;
        int release=0;
        int n=keysPressed.length();
        
        for(int i=0;i<n;i++){
            if(release<=releaseTimes[i]-time){
                if(release<releaseTimes[i]-time||answer<keysPressed.charAt(i)){
                    answer=keysPressed.charAt(i);
                    release=releaseTimes[i]-time;
                }
            }
            time=releaseTimes[i];
        }
        
        return answer;
    }
}

class Solution {
    public char slowestKey(int[] releaseTimes, String keysPressed) {
        
        //1.ds
        int n=keysPressed.length();
        //초기값 설정해 초기값과 비교함으로써 효율성 증가
        int release=releaseTimes[0];
        char answer=keysPressed.charAt(0);
        
        
        //2.loop
        for(int i=1;i<n;i++){
            if(release<=releaseTimes[i]-releaseTimes[i-1]){
                if(release<releaseTimes[i]-releaseTimes[i-1]||answer<keysPressed.charAt(i)){
                    answer=keysPressed.charAt(i);
                    release=releaseTimes[i]-releaseTimes[i-1];
                }
            }
        }
        
        return answer;
    }
}
반응형