https://programmers.co.kr/learn/courses/30/lessons/64065?language=java
풀이 과정
- 우선 주어진 문자열의 양쪽 중괄호를 제거한다.
- 정규 표현식을 사용하여 {} 내부의 값들로만 이루어진 Set 리스트를 만들어 준다.
- "{" 나 "}" 를 정규 표현식을 사용하여 표시하기 위해서는 "\\{", "\\}"로 표시해주면 된다.
- 정규 표현식으로 괄호를 포함한 문자열을 추출했다면, 괄호를 제거한 다음 "," 를 기준으로 split 해준 다음 Set을 만들어준다.
- Set 리스트를 길이 순으로 오름차순 정렬한다.
- 튜플을 구해준다.
- 남아있는 집합중 길이가 가장 짧은 Set을 가져온 다음, 여지껏 방문했던 집합을 빼준다.
- 빼주게 되면, 하나의 요소가 남는데 해당 요소가 튜플의 요소이므로 튜플에 추가한다.
소스 코드
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Solution {
public ArrayList<String> extractSetList(String s) {
String regex = "\\{[0-9|,]+\\}";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(s);
String target = s.substring(1, s.length()-1);
ArrayList<String> setList = new ArrayList<String>();
while (matcher.find()) {
setList.add(matcher.group());
}
return setList;
}
public Set<String>[] extract(String s) {
ArrayList<String> setList = extractSetList(s);
return setList.stream()
.map(p -> {
p = p.substring(1, p.length()-1);
String[] setInformation = p.split(",");
return new HashSet(Arrays.asList(setInformation));
})
.toArray(i -> new HashSet[i]);
}
public int[] solution(String s) {
List<String> answer = new ArrayList<String>();
Set<String> currentSet = new HashSet<>();
Set<String>[] sets = extract(s);
Arrays.sort(sets, (p1, p2) -> {
return Integer.compare(p1.size(), p2.size());
});
for (Set<String> targetSet : sets) {
targetSet.removeAll(currentSet);
String targetElement = targetSet.iterator().next();
answer.add(targetElement);
currentSet.addAll(targetSet);
}
return answer.stream()
.mapToInt(i -> Integer.parseInt(i))
.toArray();
}
}
'알고리즘[Java] > 프로그래머스' 카테고리의 다른 글
[ Lv 2 ] 가장 큰 수 (0) | 2022.01.30 |
---|---|
[ Lv 2 ] 짝지어 제거하기 (0) | 2022.01.28 |
[ Lv 3 ] [ DP ] 보행자 천국 (0) | 2021.12.21 |
[ Lv 2 ] [ BackTracking ] 단체사진 찍기 (0) | 2021.12.19 |