✔ 튜플
문제 분석하기
길이가 작은 튜플 순서대로 발견되지 않은 숫자를 순차적으로 담아 반환
예) (2, 1, 3, 4)
{{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}이며 원소의 순서가 바뀌어도 상관없으므로
{{2, 1, 3, 4}, {2, 1}, {2, 1, 3}, {2}}도 가능하고 {{1, 2, 3}, {2, 1}, {1, 2, 4, 3}, {2}}가 될 수도 있음
그러므로 {{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}로 길이가 작은 것부터 정렬한 후 발견되지 않은 숫자를 순차적으로 담은 (2, 1, 3, 4) 반환
손으로 풀어보기
- 집합을 길이가 짧은 순으로 정렬
- 집합을 하나씩 살펴보며 없는 값을 담아 반환
슈도코드 작성하기
s(특정 튜플을 표현하는 집합이 담긴 문자열)
list(특정 튜플을 표현하는 집합을 담을 리스트)
arr(s를 },를 기준으로 분할한 문자열 배열)
for(a -> arr만큼) {
{}를 삭제하여 저장한 정수 리스트를 list에 저장
}
list를 원소 리스트의 길이 순으로 커스텀 정렬
answer(표현하는 튜플 LinkedHashSet)
answer에 중복을 제거하여 없는 값을 저장
answer을 배열로 변환하여 반환
코드 구현하기
/**
* 64065) 튜플
*/
public class L057_64065 {
// s(특정 튜플을 표현하는 집합이 담긴 문자열)
public int[] solution(String s) {
// list(특정 튜플을 표현하는 집합을 담을 리스트)
List<List<Integer>> list = new ArrayList<>();
// arr(s를 },를 기준으로 분할한 문자열 배열)
String[] arr = s.split("},");
// {}를 삭제하여 저장한 정수 리스트를 list에 저장
for (String a : arr) {
List<Integer> parseA = parseString(a);
list.add(parseA);
}
// list를 원소 리스트의 길이 순으로 커스텀 정렬
list.sort((a, b) -> Integer.compare(a.size(), b.size()));
// answer(표현하는 튜플 LinkedHashSet)
Set<Integer> answer = new LinkedHashSet<>();
// answer에 중복을 제거하여 없는 값을 저장
for (List<Integer> l : list) {
answer.addAll(l);
}
// answer을 배열로 변환하여 반환
return answer.stream().mapToInt(Integer::intValue).toArray();
}
// 문자열에서 {}를 삭제하고 정수 리스트로 변환 함수
private List<Integer> parseString(String a) {
String parseA = a.replaceAll("[{}]", "");
return List.of(parseA.split(",")).stream().map(Integer::parseInt).collect(Collectors.toList());
}
// 테스트 케이스
public static void main(String[] args) {
L057_64065 solution = new L057_64065();
String s = "{{2},{2,1},{2,1,3},{2,1,3,4}}";
int[] result = solution.solution(s);
System.out.println(Arrays.toString(result));
}
}
'Coding Test > Java 알고리즘 실전' 카테고리의 다른 글
[68645] 삼각 달팽이 (0) | 2024.01.24 |
---|---|
[67257] 수식 최대화 (0) | 2024.01.23 |
[62048] 멀쩡한 사각형 (0) | 2024.01.23 |
[60058] 괄호 변환 (0) | 2024.01.22 |
[60057] 문자열 압축 (0) | 2024.01.20 |