[백준] 3052번: 나머지 - 자바[JAVA] (feat. HashSet)

다인·2024년 6월 21일

백준

목록 보기
3/112
post-thumbnail

이번에도 쉬운 문제이지만, 1차원 배열이 아닌 HashSet을 사용하여 풀 수도 있어서 java를 공부할 겸 정리해보려고 한다.

HashSet을 알아보쟈

HashSet이란?

  • HashSet은 Set 인터페이스를 구현한 가장 대표적인 컬렉션으로, Set 인터페이스의 특징대로 중복된 요소를 저장하지 않는다.
  • 새로운 요소를 추가할 때 add/addAll 메스드를 사용하면 된다.
    이때, 이미 같은 객체가 있으면 중복되어 저장에 실패했다는 의미로 false를 반환한다.

HashSet의 오버라이딩

  • int, string 같은 타입이 아닌, 'String:int'과 같은 형식으로 add 메서드를 사용하면 같음에도 불구하고 서로 다른 것으로 인식한다.
  • 이를 해결하기 위해 equals()와 hashCode()를 오버라이딩해야 한다.
  • hashCode()를 오버라이딩 할 때, 다음의 3가지 조건을 만족시켜야 한다.
    1. 실행 중인 애플리케이션 내의 동일한 객체에 대해서 여러 번 hashCode()를 호출해도 동일한 int 값을 반환해야 한다. 하지만, 실행 시마다 동일한 int 값을 반환할 필요는 없다 (단, equals 메서드의 구현에 사용된 멤버변수의 값이 바뀌지 않았다고 가정한다.)
    1. equals 메서드를 이용한 비교에 의해서 true를 얻은 두 객체에 대해 각각 hashCode()를 호출해서 얻은 결과는 반드시 같아야 한다.
    2. equals 메서드를 호출했을 때 false를 반환하는 두 객체는 hashCode() 호출에 대해 같은 int 값을 반환하는 경우가 있어도 괜찮지만, 해싱을 사용하는 컬렉션의 성능을 향상시키기 위해서는 다른 int값을 반환하는 것이 좋다.

📍 출처: java의 정석

풀이 방법

BufferedReader + 배열

import java.io.*;

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int[] arr = new int[42];
        
        for(int i=0; i<10; i++){
            int mod = Integer.parseInt(br.readLine()) % 42;
            arr[mod] = 1;
        }
        
        int count = 0;
        for(int i=0; i<42; i++){
            if(arr[i] == 1)
                count++;
        }
        System.out.println(count);
    }
}

Hashset

import java.io.*;
import java.util.HashSet;

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        HashSet<Integer> hs = new HashSet<Integer>();
        
        for(int i=0; i<10; i++){
            int mod = Integer.parseInt(br.readLine()) % 42;
            hs.add(mod);
        }
        System.out.println(hs.size());
    }
}

성능 차이는 없군..!

0개의 댓글