코딩테스트/Java

(2020카카오) 튜플 Java

SK_MOUSE 2021. 1. 7. 15:56
반응형

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

  • 각 문자열에 대하여 숫자를 추출해서 넣는다
  • 각 숫자에 대하여 몇번 나왔는지 카운팅 해서 카운트가 높을수록 먼저 출력된다(우선순위 上)

그래서 떠오른 것이 Map, Set을 이용하여 각 문자열("111" , "22")에 대하여 Integer로 카운팅한값을 묶어서 증가시키는 방법으로 진행하였다.

 

import java.util.*;

class Solution {
    public int[] solution(String s) {
        Map<String, Integer> map = new HashMap<>();
        String numStr = "";
        for (int i = 2; i < s.length(); i++) {//0번째랑 마지막 괄호 제외
            if(s.charAt(i) == '{' || s.charAt(i) == '}' || s.charAt(i) == ',') continue;
            while(s.charAt(i) != '}' && s.charAt(i) != ','){
                numStr+=s.charAt(i);
                i++;
            }
            //System.out.println(numStr);
            map.put(numStr, map.getOrDefault(numStr, 0)+1);
            numStr="";
        }

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

        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println(entry.getValue() + " key:" + entry.getKey());
            answer[map.size()-entry.getValue()] = Integer.parseInt(entry.getKey());
        }
        return answer;
    }
}

그리고 생성된 map을 이용하여 map의 사이즈만큼에서

 

카운팅 횟수를 뺀 index에 Key값(String->parseInt로 변환)을 넣어준다.

 


아래의 코드는 효율적인 실행속도가 나온다.

 

우선,

set을 이용한 중복처리는 같다.

import java.util.*;

class Solution {
    public int[] solution(String s) {
        Set<String> set = new HashSet<>();
        //각 집합별로 라인별로 분리
        String[] arr = s.replaceAll("[{]", " ").replaceAll("[}]", " ").trim().split(" , ");

        //길이 순서대로 정렬!
        Arrays.sort(arr, (a, b) -> {
            return a.length() - b.length();
        });
        
        int[] answer = new int[arr.length];
        int idx = 0;
        for (String s1 : arr) {
            for (String s2 : s1.split(",")) {//각 라인 문자열 완전 분리.
                if (set.add(s2)) {//만약 set에 기존에 없던 문자열인 경우 add 성공시 true
                    answer[idx++] = Integer.parseInt(s2);//true반환시 answer의 낮은 index부터 해당 문자열값이 들어감
                }
            }
        }
        return answer;
    }
}

 

  • String값을 replaceAll을 하는 방식을 이용한다.
  • trim().split(" , ")을 이용하여 라인을 분리한다.
  • Arrays.sort에서 length()를 비교하여 짧은 순서대로 정렬한다.
  • set.add로 중복처리 및 미중복 원소값은 최초add할때 true를 반환하므로 if문 활용
반응형