본문 바로가기
알고리즘 문제 풀이/프로그래머스

2019 카카오 개발자 겨울 인턴십 튜플

by 성건희 2022. 8. 10.
반응형

본 풀이는 java 언어를 사용하였습니다.
문제 보러가기

풀이

처음에 문제가 잘 이해가 안가서 문제 이해하는데 시간을 많이 썼는데, 아래와 같이 생각하니까 너무 쉬운 문제였다.

"{{2},{2,1},{2,1,3},{2,1,3,4}}"

위와같이 s 값이 들어온다면, 괄호마다 포함되는 숫자가 많을수록 앞의 숫자라는 말이된다.
숫자가 포함되는 횟수를 계산하면 아래와 같다.

2 : 4번
1 : 3번
3 : 2번
4 : 1번

가장 많은 순으로 내림차순하게 된다면 그 값이 정답이 된다.
정답 : [2, 1, 3, 4]

코드

import java.util.*;

public class Solution {

    public int[] solution(String s) {
        String[] textNumbers = removeBracket(s).split("\\|");
        Map<Integer, Integer> map = getNumberCountMap(textNumbers);
        List<Integer> listKeySet = getKeysOrderByCountDesc(map);

        int[] answer = new int[listKeySet.size()];
        for (int i = 0; i < answer.length; i++) {
            answer[i] = listKeySet.get(i);
        }
        return answer;
    }

    private String removeBracket(String text) {
        return text.substring(2, text.length() - 2)
                   .replace("},{", "|");
    }

    private Map<Integer, Integer> getNumberCountMap(String[] textNumbers) {
        Map<Integer, Integer> map = new HashMap<>();
        for (String textNumber : textNumbers) {
            Arrays.stream(textNumber.split(","))
                  .forEach(no -> {
                      Integer number = Integer.parseInt(no);
                      if (map.containsKey(number)) {
                          map.put(number, map.get(number) + 1);
                      } else {
                          map.put(number, 1);
                      }
                  });
        }
        return map;
    }

    private List<Integer> getKeysOrderByCountDesc(Map<Integer, Integer> map) {
        List<Integer> listKeySet = new ArrayList<>(map.keySet());
        listKeySet.sort((value1, value2) -> map.get(value2).compareTo(map.get(value1)));
        return listKeySet;
    }
}

회고

예제를 보고는 도저히 이해가 안됬었는데, 위 풀이처럼 간단하게 생각하니까 너무 쉬운 문제였다..
문제를 빠르게 파악하는걸 보기위해 만든 문제인듯 싶음..

반응형

댓글