이번에 풀어본 문제는
프로그래머스 튜플 입니다.
class Solution {
public int[] solution(String s) {
int[] answer;
StringTokenizer st = new StringTokenizer(s,"{},");
Map<String,Integer> hm = new HashMap<>();
while(st.hasMoreTokens())
{
String next = st.nextToken();
hm.put(next,hm.getOrDefault(next,0)+1);
}
answer = new int[hm.size()];
List<Map.Entry<String,Integer>> sortedMap = new ArrayList<>(hm.entrySet());
Collections.sort(sortedMap,new Comparator<Map.Entry<String,Integer>>()
{
@Override
public int compare(Map.Entry<String,Integer> o1, Map.Entry<String,Integer> o2)
{
return o2.getValue().compareTo(o1.getValue());
}
});
int idx = 0;
for(Map.Entry<String,Integer> next : sortedMap)
{
answer[idx++] = Integer.parseInt(next.getKey());
}
return answer;
}
}
정해진 규칙에 따라 만들어진 부분집합이 주어질 때, 각 원소들을 순서에 맞게 배열에 담아 반환하는 문제입니다.
문자열이 순서대로 주어지는 것이 아니기 때문에, 각 원소들의 발생 횟수를 카운트하여 카운트값이 큰 것이 먼저 등장하는 원소가 되도록 만들 수 있습니다.
원소를 key, 카운트를 value 로 갖는 맵을 완성하고, List에 Entry 형태로 담아 value를 기준으로 정렬해줍니다.
내림차순 정렬된 List의 원소에서 key값을 순차적으로 answer배열에 담아주면 해결할 수 있습니다.
value를 기준으로 정렬하다 보니 조금 지저분해 보일 수 있는 해답인 것 같습니다. 다른분이 해결한 set를 활용한 풀이도 참고하여 한번 더 풀어보았습니다.