https://programmers.co.kr/learn/courses/30/lessons/64065
코딩테스트 연습 - 튜플
"{{2},{2,1},{2,1,3},{2,1,3,4}}" [2, 1, 3, 4] "{{1,2,3},{2,1},{1,2,4,3},{2}}" [2, 1, 3, 4] "{{4,2,3},{3},{2,3,4,1},{2,3}}" [3, 2, 4, 1]
programmers.co.kr
본 문제는 중복을 허용하지 않으면서, 순서를 유지해야 되는 자료구조를 사용해야 한다.
자바에서는 기본적으로 Set 은 중복을 허용하지 않고, 순서를 보장하지 않으나 LinkedHashSet 은 중복은 허용하지 않고, 순서는 보장하는 자료구조가 있어서 LinkedHashSet 을 사용하면 쉽게 해결할 수 있다.
사실 그보다도 이 문제는 주어진 문자열에 대해서 분리하는 작업이 더 쉽지 않은 문제였다고 생각한다.
예시 코드는 다음과 같습니다.
import java.util.*;
class Solution {
public static int[] solution(String s) {
int[] answer = {};
List<List<Integer>> list = new ArrayList<>();
s = s.substring(1, s.length()-1);
String[] split = s.split("},");
for (int i = 0; i < split.length; i++) {
split[i] = split[i].replace("{", "");
split[i] = split[i].replace("}", "");
String[] split_num = split[i].split(",");
list.add(new ArrayList<>());
for (int j = 0; j < split_num.length; j++) {
int num = Integer.parseInt(split_num[j]);
list.get(i).add(num);
}
}
list.sort(new Comparator<List<Integer>>() {
@Override
public int compare(List<Integer> o1, List<Integer> o2) {
return Integer.compare(o1.size(), o2.size());
}
});
Set<Integer> set = new LinkedHashSet<>();
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.get(i).size(); j++) {
set.add(list.get(i).get(j));
}
}
return set.stream().mapToInt(e -> e).toArray();
}
}