- 오늘의 학습 키워드 : 중복 제거, HashSet
- HashSet 학습
- HashSet은 Set의 인터페이스 구현 클래스. 그래서 Set의 성질을 그대로 상속받는다. Set은 객체를 중복해서 저장할 수 없고 하나의 null 값만 저장할 수 있다. 그리고 저장 순서가 유지되지 않는다.
- 요소의 저장 순서를 유지해야 한다면 LinkedHashSet(JDK 1.4 부터 제공)
- Set 인터페이스를 구현한 클래스는 HashSet과 TreeSet이 있다
- HashSet의 경우 정렬을 해주지 않고 / TreeSet의 경우 자동정렬 해준다.
- Set의 가장 큰 장점, 중복을 자동으로 제거
- HashSet은 객체를 저장하기 전 객체의 hashCode() 메소드를 호출하고 해시 코드 얻은다음 저장되어 있는 객체드르이 해시 코드와 비교하고 해시 코드가 있으면 equals() 메소드로 객체 비교해서 true가 나오면 동일한 객체로 판단, 중복저장을 하지 않는다.
- 문자열을 HashSet에 저장할 경우, 같은 문자열을 갖는 String객체는 동일한 객체로 간주되고 다른 문자열을 갖는 String 객체는 다른 객체로 간주, String 클래스가 hashCode()와 equals() 메소드를 재정의해서 같은 문자열일 경우 hashCode()의 리턴 값을 같게 한다.
아래 문제 풀이
// sol1
import java.util.HashSet;
// class Solution {
// public int solution(int[] nums) {
// int answer = 0;
// int len = nums.length / 2;
// HashSet<Integer> set = new HashSet<>();
// for (int num : nums) {
// set.add(num);
// }
// int size = set.size();
// if (size >= len) {
// answer = len;
// } else {
// answer = size;
// }
// return answer;
// }
// }
public class Solution {
public int solution(int[] nums) {
int max = nums.length / 2;
// 중복제거하기
HashSet<Integer> numsSet = new HashSet<>();
for (int num : nums) {
numsSet.add(num);
}
// 중복을 제거한 셋의 크기가 max보다 크면 max를, 작으면 numsSet의 size를 리턴
if (numsSet.size() > max) {
return max;
} else {
return numsSet.size();
}
}
// @Test
// public void 정답() {
// Assert.assertEquals(2, solution(new int[]{3, 1, 2, 3}));
// }
}