프로그래머스 튜플 (Java,자바)

jonghyukLee·2022년 4월 26일
0

이번에 풀어본 문제는
프로그래머스 튜플 입니다.

📕 문제 링크

❗️코드

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를 활용한 풀이도 참고하여 한번 더 풀어보았습니다.

profile
머무르지 않기!

0개의 댓글