반응형
- 각 문자열에 대하여 숫자를 추출해서 넣는다
- 각 숫자에 대하여 몇번 나왔는지 카운팅 해서 카운트가 높을수록 먼저 출력된다(우선순위 上)
그래서 떠오른 것이 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문 활용
반응형
'코딩테스트 > Java' 카테고리의 다른 글
(2018카카오) 캐시 LRU(Least Recently Used) 알고리즘 Java (0) | 2021.01.14 |
---|---|
(2018카카오) 뉴스 클러스터링 Java (0) | 2021.01.13 |
(2020카카오) 괄호변환 Java (0) | 2021.01.07 |
(2020카카오) 문자열 압축 Java (0) | 2021.01.05 |
(2018 카카오) [1차] 다트게임 Java (0) | 2020.12.30 |