IT/Algorithm | Coding Test

[프로그래머스 64065] [Java] 튜플

iamhyeon 2025. 4. 15. 19:52


 

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())

 

 

 

반응형