[2019 카카오 개발자 겨울 인턴십] 튜플 Java 풀이
PROBLEM
https://programmers.co.kr/learn/courses/30/lessons/64065
SOLUTION
- 주어지는 튜플은 중복되는 원소가 없고,
- 표현된 집합들은 고유의 개수를 가지고 있다.
결과로 구해야하는 튜플에서 첫 번째 요소는 개수가 1개인 집합의 원소이고, 두 번째 요소는 개수가 2개인 집합에서 등장했던 원소를 제외한 원소이다. 즉, 집합의 길이 순으로 하나씩 가져오면서, 이미 등장했던 원소는 무시해야한다.
예를 들어, "[[4,2,3],[3],[2,3,4,1],[2,3]]"
에서
- 튜플의 첫 번째 요소는
[3]
에 해당하는 3이고, - 두 번째 요소는
[2,3]
에서 3을 제외한 2이고, - 세 번째 요소는
[4,2,3]
에서 3, 2를 제외한 4이고, - 네 번째 요소는
[2,3,4,1]
에서 3, 2, 4를 제외한 1이다. - 따라서 튜플은 [3, 2, 4, 1]이다.
주어지는 문자열을 탐색하면서, 집합의 길이 별로 나누어 저장한다. 각 집합 속에 숫자들을 하나씩 가져오는데,
순서는 유지하면서 중복을 제거하는 LinkedHashSet
컬렉션을 사용했다.
SOURCE CODE (JAVA)
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
import java.util.*;
class Solution {
static final int MAX_LENGTH = 500;
public int[] solution(String s) {
// 양끝 중괄호 제거
s = s.substring(1, s.length() - 1);
// 원소 개수 별로 집합이 존재한다.
String[] setByCount = new String[MAX_LENGTH + 1];
// 문자열을 탐색하면서,
// 원소가 1개인 것은 setByCount[1]에, 원소가 2개인 것은 setByCount[2]에, 이런식으로 저장한다.
int strCursor = 0;
int lengthOfSet = 0;
while (strCursor < s.length()) {
char c = s.charAt(strCursor);
if (c == '{') {
StringBuilder sb = new StringBuilder();
int elementCount = 1;
while (true) {
c = s.charAt(++strCursor);
if (c == '}')
break;
if (c == ',')
elementCount++; // 콤마 개수가 집합 속 숫자 개수
sb.append(c);
}
setByCount[elementCount] = sb.toString();
lengthOfSet++;
}
strCursor++;
}
// setByCount[]를 1부터 반복하면서
// 숫자들을 linkedSet에 삽입한다. 순서는 유지하면서 중복은 사라진다.
LinkedHashSet<Integer> linkedSet = new LinkedHashSet<>();
for (int i = 1; i <= lengthOfSet; i++) {
String[] splitted = setByCount[i].split(",");
for (String spl : splitted) {
linkedSet.add(Integer.parseInt(spl));
}
}
// linkedSet을 answer[]로 옮긴다.
int answerIdx = 0;
int[] answer = new int[lengthOfSet];
Iterator<Integer> it = linkedSet.iterator();
while (it.hasNext())
answer[answerIdx++] = it.next();
return answer;
}
}
OFF THE RECORD
다른 사람들의 풀이를 보니 단순하게 등장하는 숫자의 개수를 세서 정렬하여 풀었던데, 너무 복잡하게 생각했네…
댓글 남기기