
1. 문자열 파싱: {{2},{2,1},{2,1,3},{2,1,3,4}} → [[2], [2,1], [2,1,3], [2,1,3,4]] 형태로 바꾸기
2. 튜플 길이 순 정렬: 가장 짧은 배열부터 순서대로
3. LinkedHHashSet을 이용해 이미 포함된 원소는 제외하면서 추출
📝 Solution
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
public class 카카오_튜플 {
public int[] solution(String s) {
/* {{}} 제거, },{ 로 분리 */
s = s.substring(2, s.length()-2);
String[] sets = s.split("},\\{"); // ⏰O(n)
// System.out.println(Arrays.toString(sets));
/* 각 집합을 int[]로 변환 */
List<List<Integer>> tupleList = new ArrayList<>();
for (String set : sets) { // ⏰O(m*k)≈O(n)
// System.out.println(set);
List<Integer> nums = new ArrayList<>();
for (String num : set.split(",")) {
nums.add(Integer.parseInt(num));
}
tupleList.add(nums);
}
// System.out.println(tupleList);
/* 길이 기준으로 정렬 */
tupleList.sort(Comparator.comparingInt(List::size)); // ⏰O(n log n)
// System.out.println(tupleList);
/* 순서대로 원소 추출 */
Set<Integer> seen = new LinkedHashSet<>();
for (List<Integer> tuple : tupleList) { // ⏰O(n)
for (int num : tuple) {
if (!seen.contains(num)) {
seen.add(num);
}
}
}
// System.out.println(seen);
/* 배열로 변환 */
return seen.stream().mapToInt(Integer::intValue).toArray(); // ⏰O(n)
// => ⏰O(n log n)
}
public static void main(String[] args) {
카카오_튜플 s = new 카카오_튜플();
System.out.println(Arrays.toString(s.solution("{{2},{2,1},{2,1,3},{2,1,3,4}}"))); // 2,1,3,4
System.out.println();
System.out.println(Arrays.toString(s.solution("{{1,2,3},{2,1},{1,2,4,3},{2}}"))); // 2,1,3,4
System.out.println();
System.out.println(Arrays.toString(s.solution("{{20,111},{111}}"))); // 111,20
System.out.println();
System.out.println(Arrays.toString(s.solution("{{123}}"))); // 123
System.out.println();
System.out.println(Arrays.toString(s.solution("{{4,2,3},{3},{2,3,4,1},{2,3}}"))); // 3,2,4,1
}
}
tupleList.sort(Comparator.comparingInt(List::size));
리스트 각 요소의 size() 값을 기준으로 비교해서 오름차순 정렬한다
tupleList
List<List<Integer>> 형태의 리스트 ( [ [2], [2,1], [2,1,3], [2,1,3,4] ] )
.sort(...)
리스트를 정렬하는 메서드
내부에 정렬 기준(Comparator)을 넘겨줘야 한다
Comparator.comparingInt(...)
정렬 기준을 숫자(Int)로 지정하고 싶을 때 사용하는 자바의 정적 메서드이다
List::size
메서드 레퍼런스
각각의 리스트에서 size() 값을 가져온다
( list -> list.size() )
💡Comparator
자바에서 객체를 정렬할 때 사용하는 인터페이스
java.util.Comparator<T>는 두 객체를 비교하는 방법을 정의하는 함수형 인터페이스

💡 Comparator.comparingInt(...)
Comparator는 정렬 기준을 쉽게 만들 수 있도록 도와주는 정적 메서드들을 포함하고 있다

Comparator.comparingInt(List::size) // ⬇️
(list1, list2) -> Integer.compare(list1.size(), list2.size())


반응형
'IT > Algorithm | Coding Test' 카테고리의 다른 글
| [프로그래머스 42586] [Java] 기능개발 (0) | 2025.04.08 |
|---|---|
| [프로그래머스 12914] [Java] 멀리뛰기 (2) | 2025.03.17 |
| HashMap (0) | 2025.03.17 |
| [프로그래머스 138476] [Java] 귤 고르기 (2) | 2025.03.17 |
| [프로그래머스 12945] [Java] 피보나치 수 (0) | 2025.03.11 |