[코딩테스트] 프로그래머스 64065, 튜플

2022. 7. 15. 14:25CodingTest

문제

https://school.programmers.co.kr/learn/courses/30/lessons/64065

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제접근

  • 부분집합에서 나온 숫자들을 카운팅한 다음에 내림차순으로 정렬합니다.
  • 예를 들어 "{{2},{2,1},{2,1,3},{2,1,3,4}}" 문자열을 입력받으면 부분집합에 나온 숫자들을 카운팅하여 해시맵에 넣은 결과는 다음과 같습니다.
map = {
    1 : 3,
    2 : 4,
    3 : 2,
    4 : 1
}
  • 해시맵에서 key : 부분집합에 나온 숫자, value : 해당 숫자가 나온 횟수를 의미합니다.
  • 결과는 value가 높은 key순으로 2->1->3->4 임을 알 수 있습니다.

 

구현

import org.junit.Assert;
import org.junit.jupiter.api.Test;

import java.util.HashMap;
import java.util.Map;

public class Solution {
    public int[] solution(String s) {
        int[] answer = {};
        int len = s.length();
        String sub = s.substring(1, len-1);
        Map<Integer, Integer> counter = new HashMap<>();
        String num = "";
        for(int i = 0; i < sub.length(); i++){
            if(Character.isDigit(sub.charAt(i))){
                num += sub.charAt(i);
            }else if((sub.charAt(i) == ',' || sub.charAt(i) == '}') && !num.equals("")){
                int target = Integer.parseInt(num);
                int cnt  = counter.getOrDefault(target, 1);
                counter.put(target, cnt+1);
                num = "";
            }
        }

        answer = new int[counter.size()];

        // 부분집합에서 가장 빈번히 나온 숫자의 내림차순 탐색하여 저장
        int i = 0;
        while(counter.size() != 0){
            int max_key = 0;
            int max = 0;

            // 가장 큰 value를 가진 key를 탐색합니다.
            for(Integer key : counter.keySet()){
                if(counter.get(key) > max){
                    max = counter.get(key);
                    max_key = key;
                }
            }

            answer[i++] = max_key;
            counter.remove(max_key);
        }

        return answer;
    }

    @Test
    void test1(){
        String s = "{{2},{2,1},{2,1,3},{2,1,3,4}}";
        int[] answer = new Solution().solution(s);

        Assert.assertArrayEquals(new int[]{2, 1, 3, 4}, answer);

    }

    @Test
    void test2(){
        String s = "{{20,111},{111}}";

        int[] answer = new Solution().solution(s);
        Assert.assertArrayEquals(new int[]{111, 20}, answer);
    }
}