ArrayList의 데이터의 추가/삭제 시 많은 시간이 소요된다는 단점과, LinkedList의 데이터의 수가 많아질수록 효율이 떨어지는 단점을 극복하기 위해 제시된 방법이 Hash이다.
Hash 특징
Hash는 내부적으로 배열을 사용하여 데이터를 저장하기 때문에 빠른 검색속도를 갖는다. 데이터 추가/삭제 시 특별한 알고리즘을 이용해 데이터와 연관된 고유 숫자를 만들어 이를 인덱스로 사용한다.
HashMap
HashMap은 Map 컬렉션 중 하나로, 키와 값으로 구성된 객체를 저장하는 구조를 가진 Map의 성질을 그대로 가지고 있다. 값은 중복 저장이 가능하나, 키는 불가하다.
HashMap 선언
HashMap<String, String> mapp = new HashMap<String, String>(); //HashMap 선언
mapp.put("Baha", "enter"); //HashMap 값 추가
mapp.put("Avery", "leave");
mapp.remove("Baha"); //key값 Baha 제거
mapp.clear(); //모든 값 제거
HashMap에 값을 제거하려면 remove(key)메서드를 사용하면 된다. 키값으로만 Map의 요소를 삭제할 수 있다.
HashSet
HashSet은 Set 인터페이스에서 지원하는 구현 클래스이다. 순서대로 입력되지 않고, 일정하게 유지되지 않는다.
가장 큰 특징은 중복을 허용하지 않는다는 것이다.
+ HastSet은 객체를 저장하기 전에 먼저 객체의 hashCode() 메서드를 호출해 해시 코드를 얻어낸 다음 저장되어 있는 객체들의 해시 코드와 비교한 뒤 같은 해시 코드가 있다면 다시 equals()메서드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않는다.
HashSet 선언
HastSet<String> set1 = new HashSet<String>();
HashSet<Integer> set2 = new HashSet<Integer>();
set1.add();
set1.remove();
set1.clear();
set1.size();
LinkedHashSet
HashSet과 동일한 구조를 가지지만 HashSet은 값을 출력할 때마다 다른 순서로 출력된다. (필자는 이 사실을 모르고 계속 ArrayList를 사용하려했다...) 하지만 LinkedHashSet은 삽입된 순서대로 출력한다.
특징은 HashSet과 같이 중복을 허용하지 않는다는 것이다.
대표적인 백준 예시 문제로 #13414 수강신청 이 있다.
13414번: 수강신청
입력 데이터는 표준 입력을 사용한다. 입력은 1개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 과목의 수강 가능 인원 K(1 ≤ K ≤ 100,000)와 학생들이 버튼을 클릭한 순서를 기록한 대기목
www.acmicpc.net
'Evelyn' 카테고리의 다른 글
[알짜 공부중] Deque, 덱 (0) | 2022.09.20 |
---|---|
[알짜 공부중] Queue, 큐 (0) | 2022.09.20 |
[알짜 공부중] Stack, 스택 (0) | 2022.09.20 |
알고리즘 자료구조 공부하기 (0) | 2022.09.20 |