ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • HashSet 개념 및 예제#1
    Algorithm/Hash 2021. 12. 29. 10:22
    728x90

    저번 시간에 이어 이번 시간에는 Set에 대하여 공부해 보았다.

     

    Set인터페이스에는 HashSet, TreeSet, LinkedHashSet이 있는데 오늘은 HashSet에 대해 공부했다.

     

    HashSet : List와 비슷한 집합의 개념이지만, 중복을 허용하지 않고 순서가 없다.

    -> 중복을 허용하지 않는다는 점을 이용하여 ArrayList로 복잡하게 풀 문제들을 HashSet을 이용하여 효율적으로 코딩할 수 있는 경우들이 존재한다.

     

    -> 순서가 없다는 점으로 인해 순회를 위해서는 Iterator를 사용한다. 순서가 없어서 index표현이 불가능하므로 get(index) 메소드 대신 hasNext()next()를 이용하여 표현을 해야한다.

           

          Iterator<Integer> ir = hashSet.iterator();       //Iterator를 활용하여 인덱스 없이도 순회함.
          while(ir.hasNext()) {             //요소가 더 있는지 체크하는 메소드
                  Integer n = ir.next();        

     

    이런 느낌으로 사용한다.

     

    이제 HashSet을 이용하는 문제들을 통해 활용을 해보자! 

     

    #1. 백준 3052번 나머지 문제

     

     

    이 문제는 입력한 10개의 숫자를 42로 나누었을 때 서로 다른 나머지가 몇 개 있는지를 출력하는 문제이다.

    "서로 다른" 이라는 말에서 중복이 허용되지 않음을 캐치하고 HashSet을 이용해야겠다는 생각이 들면 best라고 할 수 있다.

    이렇게 풀어보았다. 이전 시간에는 입력을 받을 때 주로 Scanner를 사용하였는데 여기서는 BufferedReader를 사용한 것을 볼 수 있는데, 백준에서는 Scanner를 사용하면 시간초과가 발생한다. BufferedReader를 사용하자.

     

    **Scanner는 모든 단어를 하나하나 입력하는 방식이라면 BufferedReader는 버퍼 안에서 모든 입력값을 뭉뚱그려 들고다니는 셈이라 시간적 효율성이 좋다.

     

    List를 활용할 수도 있는 문제이지만 서로 다른 나머지의 개수라면 HashSet 안에서 어짜피 중복으로 알아서 제외되니 간단히 set에 추가해준 size를 뽑아내면 끝!! HashSet을 이용해서 정말 간단하게 문제를 해결할 수 있었다. 

    728x90
Designed by Tistory.