- 문제
- 튜플이란?
- 우선 문자열을 모두 숫자의 집합으로 표현해야 한다.
- 튜플 각 원소의 순서는 튜플을 표현하는 집합을 크기 순서대로 정렬했을때 연관성이 있다.
예를 들어, (a1, a2, a3) → [[a1],[a2,a3],[a3,a1,a2]]
- 크기를 순서대로 정렬했을때, 2번째 원소는 두번째 집합에 처음으로 등장한다.
package kakao.intern2019;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Q2 {
public static void main(String[] args) {
String s = "{{2},{2,1},{2,1,3},{2,1,3,4}}";
// s = "{{1,2,3},{2,1},{1,2,4,3},{2}}";
s = "{{20,111},{111}}";
// s = "{{123}}";
// s = "{{4,2,3},{3},{2,3,4,1},{2,3}}";
System.out.println(Arrays.toString(solution(s)));
}
public static int[] solution(String s) {
ArrayList<Integer> result = new ArrayList<>();
// 앞뒤 {} 삭제
s = s.substring(1, s.length() - 1);
// },{ 에서 , 삭제
s = s.replace("},{", "}{");
System.out.println("processed string = " + s);
// 문자열 순회하면서 집합으로 변환
ArrayList<ArrayList<Integer>> totalList = new ArrayList<>();
ArrayList<Integer> partList = null;
int ele = 0;
for (int i = 0; i < s.length(); i++) {
String stringEle = s.substring(i, i + 1);
if (stringEle.equals("{")) {
// 집합 시작
partList = new ArrayList<>();
} else if (stringEle.equals("}")) {
// 집합 끝
partList.add(ele);
ele = 0;
totalList.add(partList);
} else if (stringEle.equals(",")) {
// 다음 숫자
partList.add(ele);
ele = 0;
} else {
// 숫자
ele *= 10;
ele += Integer.parseInt(stringEle);
}
}
System.out.println("totalSet = " + totalList);
// 집합을 크기 순서대로 정렬
totalList.sort(new Comparator<ArrayList<Integer>>() {
@Override
public int compare(ArrayList<Integer> a, ArrayList<Integer> b) {
return Integer.compare(a.size(), b.size());
}
});
System.out.println("Sorted totalSet = " + totalList);
for (ArrayList<Integer> set : totalList) {
set.removeAll(result);
result.addAll(set);
}
int[] answer = new int[result.size()];
for (int i = 0; i < result.size(); i++) {
answer[i] = result.get(i);
}
return answer;
}
}