문제

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


코드

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
public int[] solution(String s) {
String[] strArray = getStringArray(s);
List<Integer[]> list = convertStringArrayToIntegerArrayList(strArray);
sortByArraylength(list);

List<Integer> tuple = getTuple(list);
int[] answer = convertIntegerArrayToIntArray(tuple);

return answer;
}

private String[] getStringArray(String s) {
String[] array = s.substring(2, s.length()-2).replace("},{", "@").split("@");

return array;
}

private List<Integer[]> convertStringArrayToIntegerArrayList(String[] strArray) {
List<Integer[]> list = new ArrayList<>();
for (String str : strArray) {
String[] stringNumbers = str.split(",");
Integer[] array = convertStringArrayToIntegerArray(stringNumbers);

list.add(array);
}

return list;
}

private Integer[] convertStringArrayToIntegerArray(String[] stringNumbers) {
Integer[] array = new Integer[stringNumbers.length];
int i = 0;
for (String str2 : stringNumbers) {
array[i++] = Integer.parseInt(str2);
}

return array;
}

private void sortByArraylength(List<Integer[]> list) {
Collections.sort(list, new Comparator<Integer[]>() {
@Override
public int compare(Integer[] o1, Integer[] o2) {
return o1.length - o2.length;
}
});
}

private List<Integer> getTuple(List<Integer[]> list) {
List<Integer> tuple = new ArrayList<>();

for (int i = 0; i < list.size(); i++) {
Integer[] elements = list.get(i);

for (Integer element : elements) {
if (!tuple.contains(element)) {
tuple.add(element);
}
}
}

return tuple;
}

private int[] convertIntegerArrayToIntArray(List<Integer> list) {
int[] answer = new int[list.size()];
int j = 0;
for (int i : list) {
answer[j++] = i;
}

return answer;
}

흐름

  1. 문자열을 각각 숫자를 저장한 문자열 배열로 만든다. (getStringArray)
  2. 만든 문자열 배열에 저장된 문자열을 “,”로 나눠서 각각 Integer 배열에 저장하고 그 Integer 배열을 담는 List에 저장한다. (convertStringArrayToIntegerArrayList)
  3. List에 저장된 Integer 배열을 배열의 길이가 짧은 순으로 sorting 한다. (sortByArraylength)
  4. 정렬한 list를 돌면서 Integer 배열을 꺼내고 다시 배열을 돌면서 튜플을 저장할 List에 담는데, 이 때 저장하기 전에 이미 List에 저장된 숫자인 경우엔 담을 필요가 없으므로 contain() 를 사용해서 List에 저장되지 않은 숫자만 add 한다.
  5. List형 이었으므로 문제에 맞게 int 배열 형으로 변환해서 return한다.

최다 좋아요 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
public int[] solution(String s) {
Set<String> set = new HashSet<>();
String[] arr = s.replaceAll("[{]", " ").replaceAll("[}]", " ").trim().split(" , ");
Arrays.sort(arr, (a, b)->{return a.length() - b.length();});
int[] answer = new int[arr.length];
int idx = 0;
for(String s1 : arr) {
for(String s2 : s1.split(",")) {
if(set.add(s2)) answer[idx++] = Integer.parseInt(s2);
}
}
return answer;
}
  1. 마찬가지로 우선 String을 String[]로 만들고
  2. 배열 길이 순으로 정렬한 다음에
  3. 2중 for문을 돌면서 숫자를 배열에 저장하는데,
  4. Set을 통해 이미 저장된 숫자는 저장하지 않는다.

결과

번호 속도
테스트 1 통과 (2.12ms, 52.3MB)
테스트 2 통과 (2.16ms, 52.2MB)
테스트 3 통과 (2.03ms, 50.3MB)
테스트 4 통과 (2.58ms, 52.4MB)
테스트 5 통과 (6.02ms, 52.4MB)
테스트 6 통과 (7.96ms, 50.9MB)
테스트 7 통과 (38.39ms, 53.8MB)
테스트 8 통과 (68.47ms, 61.7MB)
테스트 9 통과 (51.85ms, 57.6MB)
테스트 10 통과 (142.71ms, 62.2MB)
테스트 11 통과 (91.56ms, 65.7MB)
테스트 12 통과 (111.69ms, 74.1MB)
테스트 13 통과 (104.26ms, 72.1MB)
테스트 14 통과 (113.99ms, 74.5MB)
테스트 15 통과 (1.84ms, 50MB)

테스트 케이스

1
2
3
4
5
6
7
assertArrayEquals(new int[]{2,1,3,4}, test.solution("{{2},{2,1},{2,1,3},{2,1,3,4}}"));
assertArrayEquals(new int[]{2,1,3,4}, test.solution("{{1,2,3},{2,1},{1,2,4,3},{2}}"));
assertArrayEquals(new int[]{111,20}, test.solution("{{20,111},{111}}"));
assertArrayEquals(new int[]{123}, test.solution("{{123}}"));
assertArrayEquals(new int[]{3,2,4,1}, test.solution("{{4,2,3},{3},{2,3,4,1},{2,3}}"));
assertArrayEquals(new int[]{3,2,4,1,100}, test.solution("{{4,2,3},{3},{2,3,4,1},{2,3},{2,3,4,1,100}}"));
assertArrayEquals(new int[]{3,2,4,1,100}, test.solution("{{4,2,3},{3},{2,3,4,1},{2,3},{2,3,4,1,100}}"));