HashSet 기본 정리 JAVA

이진석·2022년 9월 25일
0

사용 동기

오늘 프로그래머스 알고리즘 문제들을 풀던 중에 배열에 중복값이 없게 입력하는 방법에 대해서 찾아보았다. 그러던 중에 HashSet이란 클래스를 사용하면 중복값이 없이 저장이 가능하다고하여 공부한 내용을 기록한다.

HashSet이란?

HashSet이란 Set 인터페이스를 구현한 클래스로 데이터들의 순서를 지정하지 않고 저장하는 자료 구조이다.

다른 ArrayList나 LinkedList 같은 많은 자료 구조에서 특정한 값을 찾기 위해서는 인덱스들을 순회하며 일치하는 값을 찾아야 하는데

HashSet은 어떤 값에 대한 hash 값을 인덱스처럼 사용하기 때문에 순회할 필요가 없다. 값이 변하지 않는 경우 그 값에 대한 hash 값도 변하지 않기 때문이다.

선언 및 사용 방법

Set<String> animals = new HashSet<>();

위와 같이 선언하여 인스턴스를 만들 수 있으며 크기나 타입을 지정(생략도) 가능하다.

animals.add("cat");
animals.add("dog");
animals.add("monkey");

System.out.println(animals);  // [monkey, cat, dog] 로 출력된다. -> 추가한 순서가 상관이 없으며 출력 할 때 마다 다른 순서로 나옴.

이렇게 add 메소드를 통해 데이터 추가가 가능하다. 데이터들은 순서 상관 없이 데이터가 들어가게 된다.

출력 값의 순서가 일정하지 않음!

animals.remove("cat"); // 전달 받은 값을 삭제한다. 메소드 타입은 boolean으로 삭제가 되었다면 True 값을 리턴하고 존재하지 않는다면 False를 리턴한다.
animals.clear();  // 모든 값을 제거
System.out.println(animals); // animals의 전체 값을 보여줌 [cat, dog, monkey]
animals.contains("cat"); // 해쉬셋 안에 cat 값이 있는지 확인

프로그래머스 두 개 뽑아서 더하기 문제를 해쉬셋을 사용해서 풀어보았다.

public int[] solution(int[] numbers) {
        Set<Integer> set = new HashSet<>();
        for (int i = 0; i < numbers.length - 1; i++) {  // 두 수의 합 모든 경우의 수 확인하여
            for (int j = i + 1; j < numbers.length; j++) {
                set.add(numbers[i] + numbers[j]);  // set에 add함. 이 떄 중복 값은 들어가지 않음
            }
        }
        Integer[] tempArray = set.toArray(new Integer[0]); // set의 값들을 그대로 가져온 tempArray를 만들어서

        int[] answer = set.stream().mapToInt(i -> i).toArray(); // Int 타입의 배열로 바꿔준다. (해당 방법은 후에 다시 정리 예정) 
        Arrays.sort(answer);

        return answer;
    }

셋은 중복 값을 가지지 않기 때문에 두 수의 합이 중복으로 나오더라도 하나의 값만 가지고 있다는 걸 활용해서 간단하게 코드를 작성했다.

profile
고양이 두마리의 집사이자 행복 코딩을 추구하는 주니어 개발자입니다!

0개의 댓글