코딩테스트/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문 활용
반응형