https://programmers.co.kr/learn/courses/30/lessons/64065

 

코딩테스트 연습 - 튜플

"{{2},{2,1},{2,1,3},{2,1,3,4}}" [2, 1, 3, 4] "{{1,2,3},{2,1},{1,2,4,3},{2}}" [2, 1, 3, 4] "{{4,2,3},{3},{2,3,4,1},{2,3}}" [3, 2, 4, 1]

programmers.co.kr

 

본 문제는 중복을 허용하지 않으면서, 순서를 유지해야 되는 자료구조를 사용해야 한다.

자바에서는 기본적으로 Set 은 중복을 허용하지 않고, 순서를 보장하지 않으나 LinkedHashSet 은 중복은 허용하지 않고, 순서는 보장하는 자료구조가 있어서 LinkedHashSet 을 사용하면 쉽게 해결할 수 있다.

 

사실 그보다도 이 문제는 주어진 문자열에 대해서 분리하는 작업이 더 쉽지 않은 문제였다고 생각한다.

예시 코드는 다음과 같습니다.

 

import java.util.*;
class Solution {
    public static int[] solution(String s) {
        int[] answer = {};

        List<List<Integer>> list = new ArrayList<>();
        s = s.substring(1, s.length()-1);

        String[] split = s.split("},");

        for (int i = 0; i < split.length; i++) {
            split[i] = split[i].replace("{", "");
            split[i] = split[i].replace("}", "");
            String[] split_num = split[i].split(",");
            list.add(new ArrayList<>());
            for (int j = 0; j < split_num.length; j++) {
                int num = Integer.parseInt(split_num[j]);
                list.get(i).add(num);
            }
        }
        list.sort(new Comparator<List<Integer>>() {
            @Override
            public int compare(List<Integer> o1, List<Integer> o2) {
                return Integer.compare(o1.size(), o2.size());
            }
        });

        Set<Integer> set = new LinkedHashSet<>();
        for (int i = 0; i < list.size(); i++) {
            for (int j = 0; j < list.get(i).size(); j++) {
                set.add(list.get(i).get(j));
            }
        }
        return set.stream().mapToInt(e -> e).toArray();
    }
}

+ Recent posts