GiantStepDEV
article thumbnail

HashSet

  • ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ค‘๋ณต ๊ฐ’์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ค‘๋ณต ์—ฌ๋ถ€ ํ™•์ธ์€ HashCode()์˜ ๋ฆฌํ„ด ๊ฐ’์„ ์ด์šฉ ํ•ฉ๋‹ˆ๋‹ค. (๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ)
  • ์ˆ˜ํ•™์˜ ์ง‘ํ•ฉ๊ณผ ์œ ์‚ฌํ•œ ๊ฐœ๋…(ํ•ฉ์ง‘ํ•ฉ, ๊ต์ง‘ํ•ฉ, ์ฐจ์ง‘ํ•ฉ)

import java.util.Arrays;
import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
        HashSet<Member> set = new HashSet<>();
        set.add(new Member(1000, "์–‘์ฝฉ๋ฏธ"));
        set.add(new Member(1001, "๊ฐ•๋ฏผ๊ฒฝ"));
        set.add(new Member(1002, "ํ™๊ธธ๋™"));
        Member member = new Member(1003, "ํ•œ๋ผ๋ด‰");
        set.add(member);
        set.add(new Member(1002, "๊น€๋”ธ๊ธฐ"));

        for(Member e : set) {
            e.showMember();
        }
    }
}
id : 1000
์ด๋ฆ„ : ์–‘์ฝฉ๋ฏธ
---------------
id : 1001
์ด๋ฆ„ : ๊ฐ•๋ฏผ๊ฒฝ
---------------
id : 1002
์ด๋ฆ„ : ํ™๊ธธ๋™
---------------
id : 1003
์ด๋ฆ„ : ํ•œ๋ผ๋ด‰
---------------
id : 1002
์ด๋ฆ„ : ๊น€๋”ธ๊ธฐ
---------------

๐Ÿธ : ํ˜น์‹œ ์ด ์ฝ”๋“œ์—์„œ ์ด์ƒํ•œ ์  ๋ชป ๋А๊ผˆ๋‚˜?

๐Ÿถ : ๋ฐฉ๊ธˆ Set ํด๋ž˜์Šค๋Š” ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค ํ–ˆ๋Š”๋ฐ id 1002๊ฐ€ ์ค‘๋ณต์ธ๋ฐ๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋‘˜ ๋‹ค ์ถœ๋ ฅ๋์–ด. ์–ด๋–ป๊ฒŒ ๋œ๊ฑฐ์ง€?

๐Ÿธ : ๊ฐ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ฐธ์กฐ ๋ณ€์ˆ˜ 'set'์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ๊ฐ€ ๊ฐ๊ธฐ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— hashCode()๋„ ๋‹ค๋ฅด๊ฒŒ ๋ฆฌํ„ด๋๊ธฐ ๋•Œ๋ฌธ์ด์•ผ.

Set ํด๋ž˜์Šค๋Š” ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด hashCode() ๋ฆฌํ„ด๊ฐ’์ด ๊ฐ™๊ณ , equals() ๋ฆฌํ„ด๊ฐ’ true๋ฉด ๋™๋“ฑ ๊ฐ์ฒด๋กœ ๋ด. ๋”ฐ๋ผ์„œ hashCode()์™€ equals()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜(?)๋ฅผ ์—†์•จ ์ˆ˜ ์žˆ์–ด.

๐Ÿถ : ๋ญ” ๋ง์ธ์ง€ ์ดํ•ด๊ฐ€ ์–ด๋ ค์›Œ ๊ฐœ๊ตด

๐Ÿธ : ๊ทธ๋ฆผ์œผ๋กœ ๋‹ค์‹œ ์„ค๋ช…ํ•ด์ค„๊ฒŒ.

๐Ÿธ : ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋Š” Heap ๋ฉ”๋ชจ๋ฆฌ์— '๊ฐ’'์ด ์•„๋‹Œ ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ๋‹ด๊ธด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด. ์ด ์ฃผ์†Œ๊ฐ’์„ ํ† ๋Œ€๋กœ hashFunction์—์„œ hashCode๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ id๊ฐ€ ๊ฐ™๋“  ์•„๋‹ˆ๋“  ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ์ธ์‹ํ•˜๋Š”๊ฑฐ์ง€.

์ด๊ฑธ ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋กœ hashCode()์™€ equals()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜๋ฉด id๊ฐ€ ๊ฐ™์œผ๋ฉด ๋™๋“ฑํ•œ ๊ฐ์ฒด๋กœ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์–ด!

๐Ÿถ : ์ž์„ธํ•œ ์„ค๋ช… ๊ณ ๋งˆ์›Œ ๊ฐœ๊ตด

class Member {
    int id;
    String name;

    @Override // Object์˜ hashCode()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ
    public int hashCode() {
        return id;
    }

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Member) { // ๋ชจ๋“  ํด๋ž˜์Šค ์ค‘ Member ํด๋ž˜์Šค ํƒ€์ž…์ด๋ฉด true
            Member member = (Member) obj; // ๋ถ€๋ชจ ๊ฐ์ฒด์—์„œ ์ž์‹ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์šด์บ์ŠคํŒ… ์‚ฌ์šฉ
            if(this.id == member.id) return true;
        } else return false;
        return false;
    }

    public Member(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public void showMember() {
        System.out.println("id : " + id);
        System.out.println("์ด๋ฆ„ : " + name);
        System.out.println("---------------");
    }
}

main์—์„œ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด

id : 1000
์ด๋ฆ„ : ์–‘์ฝฉ๋ฏธ
---------------
id : 1001
์ด๋ฆ„ : ๊ฐ•๋ฏผ๊ฒฝ
---------------
id : 1002
์ด๋ฆ„ : ํ™๊ธธ๋™
---------------
id : 1003
์ด๋ฆ„ : ํ•œ๋ผ๋ด‰
---------------

๊ต์ง‘ํ•ฉ, ํ•ฉ์ง‘ํ•ฉ, ์ฐจ์ง‘ํ•ฉ ๊ตฌํ•˜๊ธฐ

๊ต์ง‘ํ•ฉ

public static void main(String[] args) {
    HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1,2,3,4,5,6));
        HashSet<Integer> s2 = new HashSet<>(Arrays.asList(4,5,6,7,8,9));
        s1.retainAll(s2); // ๊ต์ง‘ํ•ฉ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฉ”์†Œ๋“œ
        System.out.println(s1);
}

ํ•ฉ์ง‘ํ•ฉ

public static void main(String[] args) {
        HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1,2,3,4,5,6));
        HashSet<Integer> s2 = new HashSet<>(Arrays.asList(4,5,6,7,8,9));
        s1.addAll(s2); // ํ•ฉ์ง‘ํ•ฉ์„ ์ˆ˜ํ–‰
        System.out.println(s1);
    }

์ฐจ์ง‘ํ•ฉ

public static void main(String[] args) {
    HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6));
    HashSet<Integer> s2 = new HashSet<>(Arrays.asList(4, 5, 6, 7, 8, 9));

    HashSet<Integer> substract = new HashSet<>(s1);  // s1์œผ๋กœ substract ์ƒ์„ฑ
    substract.removeAll(s2); // ์ฐจ์ง‘ํ•ฉ ์ˆ˜ํ–‰
    System.out.println(substract);  // [1, 2, 3] ์ถœ๋ ฅ
}

๊ด€๋ จ ๋ฉ”์†Œ๋“œ

๊ฐ’ ์ถ”๊ฐ€ํ•˜๊ธฐ(add)

public static void main(String[] args) {
    HashSet<String> set = new HashSet<>();
    set.add("Jump");
    set.add("To");
    set.add("Java");
    System.out.println(set);  // [Java, To, Jump] ์ถœ๋ ฅ
}

๊ฐ’ ์—ฌ๋Ÿฌ ๊ฐœ ์ถ”๊ฐ€ํ•˜๊ธฐ(addAll)

public static void main(String[] args) {
    HashSet<String> set = new HashSet<>();
    set.add("Jump");
    set.addAll(Arrays.asList("To", "Java"));
    System.out.println(set);  // [Java, To, Jump] ์ถœ๋ ฅ
}

ํŠน์ • ๊ฐ’ ์ œ๊ฑฐํ•˜๊ธฐ(remove)

public static void main(String[] args) {
    HashSet<String> set = new HashSet<>(Arrays.asList("Jump", "To", "Java"));
    set.remove("To");
    System.out.println(set);  // [Java, Jump] ์ถœ๋ ฅ
}

โœ๏ธ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์˜ˆ์ œ๐Ÿธ

๋ฌธ์ œ : ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ง„ N๊ฐœ์˜ ๋‹จ์–ด๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ •๋ ฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ

 

์กฐ๊ฑด 1. ๊ธธ์ด๊ฐ€ ์งง์€ ๊ฒƒ ๋ถ€ํ„ฐ
์กฐ๊ฑด 2. ๊ธธ์ด๊ฐ€ ๊ฐ™์œผ๋ฉด ์‚ฌ์ „ ์ˆœ์œผ๋กœ
์กฐ๊ฑด 3. ์ค‘๋ณต ์ œ๊ฑฐ

 

์ž…๋ ฅ : 13 but i wont hesitate no more no more it cannot wait im yours
์ถœ๋ ฅ : i im it no but more wait wont yours cannot hesitate

import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        String[] word = new String[n];
        for(int i = 0; i < word.length; i++) {
            word[i] = sc.next();
        }
        // โ˜… HashSet์„ ์ด์šฉํ•ด ์ค‘๋ณต ์ œ๊ฑฐ ํ›„ word ๋ฐฐ์—ด์— ๋‹ค์‹œ ๋‹ด์Œ.
        HashSet<String> hashSet = new HashSet<>(Arrays.asList(word));
        word = hashSet.toArray(new String[0]); // ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ 0์œผ๋กœ ์ง€์ •ํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋ฐฐ์—ด ํฌ๊ธฐ๊ฐ€ ์ง€์ •๋จ
        Arrays.sort(word, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                if(o1.length() == o2.length()) {
                    return o1.compareTo(o2); // ๊ฒฐ๊ณผ๊ฐ€ ์–‘์ˆ˜์ด๋ฉด ์ •๋ ฌ ์กฐ๊ฑด (o2๊ฐ€ ์‚ฌ์ „์ˆœ์œผ๋กœ ๋” ์•ž์ธ ๊ฒฝ์šฐ)
                } else {
                    return o1.length() - o2.length(); // ๊ฒฐ๊ณผ๊ฐ€ ์–‘์ˆ˜์ด๋ฉด ์ •๋ ฌ ์กฐ๊ฑด
                }
            }
        });
        for(String e : word) System.out.print(e + " ");
    }
}
profile

GiantStepDEV

@kongmi

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!