본문 바로가기

알고리즘/프로그래머스

[2019 카카오 개발자 겨울 인턴십] 튜플(Java, 깊은 복사, 문자열 처리)

## 접근


1. 주어진 문자열을 {{a1}, {a1, a2}, {a1, a2, a3}, {a1, a2, a3, a4}, ... {a1, a2, a3, a4, ..., an}}의 형태로 변환해야 한다. 이 집합들을 담고 있는 자료구조는 집합의 길이를 기준으로 정렬되어야 한다.

* an을 구하기 위해서는, a1 ~ an-1을 알고 있어야 한다. 그래서, 집합의 길이를 기준으로 정렬하면서 a1부터 순차적으로 찾는다.

 

 

 

 

2. 정렬된 자료구조를 이용해, an을 구한다. {an, an - 1, a1, a2, ...} 식으로 순서가 섞여있더라도, 이미 an-1까지 알고 있으므로 an를 선택할 수 있다 an-1까지를 Set 자료구조를 이용해서 저장한다.

 

 

 

 

 

## 유의사항


1. 주어진 문자열들을 집합으로 변환하고, 자료구조에 집합들을 저장할 때 깊은 복사가 이루어져야 한다. new를 통해서 해결해준다.

 

 

 

 

 

 

## 해설코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import java.util.*;
import java.lang.*;
import java.io.*;
 
class Solution {
    public int[] solution(String s) {
        int[] answer = {};
        s = s.substring(1, s.length() - 1);
        ArrayList<ArrayList<Integer>> aList = new ArrayList<>();
        ArrayList<Integer> list = new ArrayList<>();
        
        String[] sArr = s.split(",");
        for(int i = 0; i < sArr.length; i++){
            if(sArr[i].charAt(0== '{'){
                if(sArr[i].charAt(sArr[i].length() - 1== '}'){
                    list.add(Integer.valueOf(sArr[i].substring(1, sArr[i].length() - 1)));
                    aList.add(new ArrayList<Integer>(list));
                    list.clear();
                    continue;
                }
                list.add(Integer.valueOf(sArr[i].substring(1, sArr[i].length())));
            }else if(sArr[i].charAt(sArr[i].length() - 1== '}'){
                list.add(Integer.valueOf(sArr[i].substring(0, sArr[i].length() - 1)));
                aList.add(new ArrayList<Integer>(list));
                list.clear();
            }else{
                list.add(Integer.valueOf(sArr[i]));
            }
        }
        
        Collections.sort(aList, new Comparator<ArrayList<Integer>>(){
            public int compare(ArrayList<Integer> list1, ArrayList<Integer> list2){
                return Integer.compare(list1.size(), list2.size());
            }
        });
        
        
        // Make Result
        ArrayList<Integer> ansList = new ArrayList<>();
        HashSet<Integer> hs = new HashSet<>();
        
        for(ArrayList<Integer> pList : aList){
            for(int num : pList){
                if(!hs.contains(num)){
                    hs.add(num);
                    ansList.add(num);
                }
            }
        }
        
        answer = new int[ansList.size()];
        for(int i = 0; i < ansList.size(); i++)
            answer[i] = ansList.get(i);
        
        return answer;
    }
}