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();
}
}