작성
·
36
0
안녕하세요! 저는 HashSet을 사용해서 풀었는데요!
public int solution(int n, int k, int[] arr) {
int answer = -1;
// HashSet으로 변경
Set<Integer> set = new HashSet<>();
// 모든 3개 조합의 합을 HashSet에 추가
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
for (int l = j + 1; l < n; l++) {
set.add(arr[i] + arr[j] + arr[l]);
}
}
}
// HashSet을 List로 변환
List<Integer> list = new ArrayList<>(set);
// 내림차순 정렬
Collections.sort(list, Collections.reverseOrder());
// K번째 값 반환
if (list.size() >= k) {
return list.get(k - 1);
}
return answer;
}
커뮤니티 보니 treeSet을 사용하는 이유가 "같은 숫자의 카드가 여러장 있을 수 있습니다."라고 하셨는데,
강의 내에 코드는 3개의 카드를 더한 값에 대한 중복 제거지, 각 카드 숫자에 대한 중복을 제거하는건 아니지 않나요..??
hashSet을 사용하는게 O(n3)로 시간복잡도가 더 나은 것 같은데 treeSet을 사용해야 하는 이유를 아직 이해 못했습니다 ㅠㅠ
답변 1
0
안녕하세요^^
3개를 더한 값의 중복을 제거하기 위해 셋을 사용한게 맞습니다.
TreeSet을 사용한 것은 TreeSet이 정렬을 자동 지원하기 때문에 사용한 것입니다.
ArrayList로 변환한 다음 정렬을 하기보다는 트리셋을 사용하면 바로 정렬이 되기 때문입니다.