

<풀기 전 생각>
1. 필요한 튜플에 대한 정보가 주어진 문자열이 {}로 둘러싸인 구조 임으로 String의 indexOf() 함수를 사용하여 "{", "}" 중괄호의 인덱스를 일일이 구한 뒤 문자열의 배열로 분리
2. 그렇게 분리된 문자열 들을 Stream 클래스의 sort() 메서드를 통해 길이 순으로 정렬
3. Set을 사용하여 중복을 체크 하면서 튜플 생성
<중간 문제점>
프로그래머스에서 Stream.toList() 메서드를 인식을 하지 않아서 고민 했었는데
import java.util.stream.Collectors;
.collect(Collectors.toList()); 다음 과 같은 방식으로 형태를 변환한 뒤 사용하니 해결 할 수 있었다.
<최종 코드>
import java.util.*;
import java.util.stream.Collectors;
class Solution {
// 시간 복잡도 O(n*m) 공간 복잡도 O(n)
public int[] solution(String s) {
ArrayList<String> units = new ArrayList<String>();
// 업 캐스팅 자식 타입 객체가 부모 객체로 형변환
List<String> sortedUnits = new ArrayList<String>();
String tmp = s.substring(1,s.length()-1);
// 괄호를 제거한 튜플의 각 원소들을 리스트 형태로 추출
units = getUnits(tmp);
// 문자열 길이에 따른 정렬
sortedUnits=units.stream().sorted(Comparator.comparing(String::length)).collect(Collectors.toList());
return makeTuple(sortedUnits);
}
// 시간 복잡도 O(1) 공간 복잡도 O(n)
private ArrayList<String> getUnits(String s){
ArrayList<String> ans = new ArrayList<String>();
int frontBraCapIndex = 0;
int beforeBraCapIndex = 0;
while(true){
frontBraCapIndex=s.indexOf("{",frontBraCapIndex);
beforeBraCapIndex=s.indexOf("}",beforeBraCapIndex);
if(frontBraCapIndex==-1||beforeBraCapIndex==-1) break;
ans.add(s.substring((frontBraCapIndex++)+1,beforeBraCapIndex++));
}
return ans;
}
// 시간 복잡도 O(n*m) 공간 복잡도 O(n)
private int[] makeTuple(List<String> sortedUnits){
int tuple[] = new int[sortedUnits.size()];
HashSet<Integer> duplicateChecker = new HashSet<Integer>();
int tupleIndex = 0;
for (String unit:sortedUnits) {
String numArray[] = unit.split(",");
for (String num: numArray) {
int transNum = Integer.parseInt(num);
if(!duplicateChecker.contains(transNum))
tuple[tupleIndex++]=transNum;
duplicateChecker.add(transNum);
}
}
//System.out.println("test");
return tuple;
}
}
<메모>
나는 일일이 "{", "}"을 찾고 문자열을 분리시키는 생각을 하였는데 우수 풀이에서는 애초에 분리 시킬 때 방해가 되는 요소를 모두 삭제 후 분리 작업을 시행하였는데 내가 사용한 방법보다 좋은 방법인 것 같다.
또한 Stream은 항상 느리다는 점을 감안하여 Arrays.sort() 메소드를 사용한 것도 인상 깊었다.
String[] arr = s.replaceAll("[{]", " ").replaceAll("[}]", " ").trim().split(" , ");
Arrays.sort(arr, (a, b)->{return a.length() - b.length();});

