- 문제를 이해하는 것부터 어려웠고, 질문하기에서 힌트를 얻었지만, 결국 다른 사람의 풀이를 참고하게 되었다.
- HashMap을 사용하여, 튜플배열에 등장하는 a1부터 an까지 구해 answer배열에 넣어주려고 했지만, Hashmap에서 value 기준으로 key를 정렬 할 때 오류가 낫고, 문자열 다루는 것이 매끄럽게 되지 않았다.
- 스트림과 람다식에 익숙해질 필요를 느꼈다. 잘 다룰수록, 필요한 부분에서 깔끔한 코드를 가져올 수 있는거 같다.
import java.util.*;
class Solution {
public int[] solution(String s) {
int[] answer = {};
s = s.replaceAll("[\\{,\\}]", " "); // "{" "," "}" 제거
String[] sa = s.split("[ ]+"); // 하나 이상의 공백(+정규식)을 기준으로 문자열 나누기.
Map<String, Integer> hashMap = new HashMap<>(); // 숫자 출현 빈도 저장을 위한 hashmap
for(int i = 0; i < sa.length; i++){
if (!sa[i].equals("")){ // 공백이 아닐 경우.
if (hashMap.containsKey(sa[i])){ // 해당 숫자의 빈도 저장
hashMap.replace(sa[i], hashMap.get(sa[i]) + 1);
}else{
hashMap.put(sa[i], 1);
}
}
}
List<Map.Entry<String, Integer>> list = new ArrayList<>(hashMap.entrySet()); // hashMap to List
// 출력하면 list: [String = Integer, String=Integer, String=Integer] 식으로나옴.
Collections.sort(list, (o1, o2) -> {return o2.getValue().compareTo(o1.getValue());}); // 빈도에 따라 숫자 정렬.
answer = new int[list.size()]; // answer 배열 생성.
for(int i = 0; i < answer.length; i++){
answer[i] = Integer.parseInt(list.get(i).getKey());
}
return answer;
}
}
- 다른 사람 방법 풀이
- Set을 활용하여 푼 풀이. 문자열을 배열로 만드는 것까지는 비슷하다.
- 배열 내에서 문자열이 짧은 요소(길이를 기준으로 오름차순)대로 정렬한다.
- 튜플배열을 순회하면서, set.add가 true라면(set.add의 리턴값은 boolean이다.) 새로 등장한 요소, 즉 n-튜플의 an요소이므로 answer에 추가해준다.
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)) answer[idx++] = Integer.parseInt(s2);
}
}
return answer;
}
}