Rank Teams by Votes (Java)

유승선 ·2023년 2월 17일
0

LeetCode

목록 보기
81/115

Sorting 문제들을 자바로 풀면서 내 실력의 부족함 + 얼마나 C++ 언어가 편했나를 세삼 깨달았다. 자바를 사용하는 환경과 C++을 사용하는 환경은 분명히 다른점이 훨씬 많겠지만, 그래도 현 시점에서 내 C++과 Java의 역량을 맞춰주기 위해서 약간의 불편함을 끌어안고 정렬 문제를 풀었다.

정렬 문제는 Map의 대한 이해와 정렬의 이해도를 정말 잘 알려준다. 그리고 내가 이 문제에서 느꼈던 자바 Sorting에 대한 오해가 풀렸다.

else if(hashMap.get(a)[i] < hashMap.get(b)[i]){
    return hashMap.get(b)[i] - hashMap.get(a)[i]; 
}

나느 이 부분에서 저 "-" 부분이 솔직히 어떤거를 의미하는지 잘 몰랐다. Lambda Sorting을 C++에서 할때는 별 생각없이 척하면 척하고 됐는데 자바에서는 살짝 아쉽다. 결론적으로 저 "-" 부분은 그냥 뺴기를 의미했다... 근데 빼기인데 return 1 ? return -3? 이런식의 계산은 어떻게 sorting에 영향을 주는거지? 생각해봤다.

이제 보니깐 결국 우리는 sorting 할때 오름차순으로 진행을 하고 .get(a) - .get(b) 에서 a 와 b는 현재 값과, 비교값이다. 만약에 현재 값이 더 크고, 현재값을 오름차순 순서대로 하고 싶으면 (a) - (b)를 하면되고, 현재 값을 비교하는 값보다 전으로 만들고 싶으면 음수 값을 주면 된다. 아직 이해하기 어려운 로직일수 있겠지만 양수 음수 그리고 0 (동일한 값) 을 생각하면 좀 더 이해하기 괜찮다.

class Solution {
    public String rankTeams(String[] votes) {
        Map<Character,int[]> hashMap = new HashMap<>(); 
        List<Character> lst = new LinkedList<>(); 
        for(char c : votes[0].toCharArray()){
            //hashMap[c] = new int[votes[0].length()]; 
            hashMap.put(c, new int[votes[0].length()]);
            lst.add(c); 
        }
        
        for(String s : votes){
            for(int i = 0; i < s.length(); i++){
                hashMap.get(s.charAt(i))[i]++; 
            }
        }
        

        Collections.sort(lst,(a,b)->{
            for(int i = 0; i < hashMap.get(a).length; i++){
                if(hashMap.get(a)[i] > hashMap.get(b)[i]){
                    return -1; 
                }
                else if(hashMap.get(a)[i] < hashMap.get(b)[i]){
                    return hashMap.get(b)[i] - hashMap.get(a)[i]; 
                }
            }
            return a.compareTo(b); 
        });
        
        StringBuilder answer = new StringBuilder(); 
        for(Character c : lst){
            answer.append(c); 
        }
        
        return answer.toString(); 
    }
}
profile
성장하는 사람

0개의 댓글