[Java] Section4. HashMap, TreeSet

Nam_JU·2022년 8월 16일
0

Algorithm

목록 보기
5/20
post-thumbnail

Map Collection

Map 컬렉션은 Key와 Value로 구성된 Entry 객체를 저장하는 구조를 가지고 있다.
키는 중복 저장될 수 없고, 값은 중복 저장될 수 있다. 만약 기존 키와 동일한 키로 값을 저장하면, 새로운 값으로 바뀌게된다.

  • Map 컬렉션에서 객체를 추가할때, put(key, value)메소드를 사용하고, key를 이용해 value를 찾아올 때에는 get(key)메소드를 사용하고, 삭제에는 remove(key)메소드를 사용한다.

HashMap

  • 배열과 연결이 결합된 형태.
  • hashing 기법을 사용하기 때문에 많은 양의 데이터가 저장될때 유용, 검색에 최고성능을 보인다.
  • 추가/삭제/검색/접근성이 모두 뛰어나다.
  • 순서가 유지되지 않는다.
    (순서유지가 필요하다면 LinkedHashMap을 사용한다.)
  • Key값은 중복 불가, Value는 중복 가능하다
    (만약 기존 키와 동일한 키로 값을 저장하면, 새로운 값으로 바뀌게된다.)

Set Collection

  • 집합의 개념으로 인덱스 정보를 포함하고 있지 않음
  • 중복 저장 불가
    인덱스 정보가 없기 때문에 중복된 원소 중 특정 위치 값을 꺼낼 방법이 없다.
  • Set은 Collection을 상속받지 않고 별도의 인터페이스를 가진다.
    • HashSet: 저장을 위해 해쉬 테이블을 사용한다. 삽입 순서를 유지하지 않는다. 입력순서와 출력 순서가 다르다
    • LinkedHashSet: HashSet을 확장한 클래스로 삽입 순서를 유지한다. 입력순서와 출력 순서가 동일하다
    • TreeSet: 저장을 위해 트리를 사용한다. 요소들이 정렬되어 있다. 레드-블랙 트리로 구현되어 있다.
      입력이 어떻게 되던지 출력은 무조건 오름차순이다

HashSet

  • hashCode()
    객체를 기반으로 생성된 위치 값(고유 값)
    실제 번지와 다르다
  • equals()
    Object의 equal()은 == 와 동일한 저장 번지 비교
    == (등가연산자)는 stack 메모리의 값을 비교
    stack메모리에는 참조값 (저장번지)가 들어가져있다
    객체가 가리키는 곳이 동일한 메모리 주소일 경우에만 동일한 객체가 된다.
  • 입력순서, 출력 순서가 다르다
  • Set인터페이스를 구현한 구현 클래스
  • 수집(collect)한 원소(Element)를 집합의 형태로 관리하며 저장용량을 동적관리한다
  • 입력의 순서와 출력의 순서는 동일하지 않을 수 있다
    주머니에서 꺼내는 것이기 때문에 순서가 다를 수 있다는 것에 주의

TreeSet

  • Set 인터페이스를 구현한 구현 클래스
  • 수집한 원소를 집합의 형태로 관리하며 저장공간을 동적으로 관리한다
  • 입력 순서와 관계없이 크기 순서로 출력한다. 저장원소는 대소비교가 가능해야 한다



1. 학급회장

import java.util.HashMap;
import java.util.Scanner;

public class Main01 {
    public static char solution(int n, String str){
        char answer = ' ';
        HashMap<Character, Integer> map = new HashMap<>();
        for (char x : str.toCharArray()){
                                            //값이 없으면 vlaue에 +1 증가
            map.put(x, map.getOrDefault(x, 0)+1);
        }
        int max = Integer.MIN_VALUE;
                        //map 탐색
        for (char key : map.keySet()){
           // System.out.print(x+" "+ map.get(x));
           if (map.get(key)>max){
               max = map.get(key);
               answer = key;
           }
        }
        return answer;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        String str = sc.next();
        System.out.print(solution(n, str));
    }
}
  • map.getOrDefault(key, defaultValue) : 찾는 키가 존재한다면 찾는 키의 값을 반환하고 없다면 기본 값을 반환하는 메소드
    • defaultValue : 지정된 키로 매핑된 값이 없는 경우 반환되어야 하는 기본 값
  • map.keySet() : key값만 전체 출력
  • map.containsKey(key) : 맵에서 인자로 보낸 키가 있으면 true 없으면 false를 반환한다
  • map.size() : key의 종류
  • map.remove(key) : key를 제거
  • map.get(key) : key에 해당되는 value값을 얻기

2. 아나그램

import java.util.HashMap;
import java.util.Scanner;

public class Main02 {
    public static String solution(String str1, String str2){
        String answer = "YES";
        HashMap<Character, Integer> map = new HashMap<>();
        for (char x : str1.toCharArray()){
            map.put(x, map.getOrDefault(x,0)+1);
        }
        //key 존재여부 확인
        for (char x : str2.toCharArray()){
            // key가 x 혹은 0을 가지고 있지 않으면
            if (!map.containsKey(x) || map.get(x)==0)
                return "NO";
            // 가지고 있다면 감소시켜서 이중확인
            map.put(x, map.get(x)-1);
        }
        return answer;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str1 = sc.next();
        String str2 = sc.next();
        System.out.print(solution(str1, str2));
    }

}
  • map.containsKey(key) : 맵에서 인자로 보낸 키가 있으면 true 없으면 false를 반환한다
  • map.get(key) : 파라미터로 입력받은 값이 Map에 존재하면, 입력받은 값을 리턴하고,만약 파라미터로 입력받은 값이 Map에 존재하지 않으면, null을 리턴

3. 매출액의 종류

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;

public class Main03 {
    public static ArrayList<Integer> solution(int n, int k, int []arr){
        ArrayList<Integer> answer = new ArrayList<>();
        //잘라진 구간에서의 map을 구해야함
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i=0; i<k-1; i++){
            map.put(arr[i], map.getOrDefault(arr[i],0)+1);
        }
        int lt = 0;
        for (int rt= k-1; rt<n; rt++){
            map.put(arr[rt], map.getOrDefault(arr[rt], 0)+1);
            answer.add(map.size());
            map.put(arr[lt], map.get(arr[lt])-1);
            if (map.get(arr[lt])==0)
                map.remove(arr[lt]);
            lt++;
        }
        return answer;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();
        int []arr = new int[n];
        for (int i=0; i<n; i++){
            arr[i] = sc.nextInt();
        }
        for (int x : solution(n, k, arr))
        System.out.print(x + " ");
    }
}

4. 모든 아나그램 찾기

import java.util.HashMap;
import java.util.Scanner;

public class Main04 {
    public static int solution(String n, String t){
        int answer = 0;
        HashMap<Character , Integer> amap = new HashMap<>();
        HashMap<Character , Integer> bmap = new HashMap<>();
        int L = t.length()-1;
        //비교군 t
        for (char x : t.toCharArray())amap.put(x,amap.getOrDefault(x,0)+1);
        //비교 대상 n
        for (int i=0; i<L; i++)
            bmap.put(n.charAt(i),bmap.getOrDefault(n.charAt(i),0)+1);
            int lt =0;
            for (int rt=L; rt<n.length(); rt++){
                bmap.put(n.charAt(rt), bmap.getOrDefault(n.charAt(rt),0)+1);
                if (bmap.equals(amap)) answer++;
                bmap.put(n.charAt(lt), bmap.get(n.charAt(lt))-1);
                if (bmap.get(n.charAt(lt))==0) bmap.remove(n.charAt(lt));
                lt++;
        }
        return answer;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        String t= sc.next();
        System.out.println(solution(s, t));
    }
}

5. K번째 큰 수

package section04;

import java.util.Collections;
import java.util.HashMap;
import java.util.Scanner;
import java.util.TreeSet;

public class Main05 {
    public static int solution(int n, int k, int[]arr){
     int answer = -1;                            //내림차순 정렬
        TreeSet<Integer> Tset = new TreeSet<>(Collections.reverseOrder());
        for (int i=0; i<n; i++){
            for (int j=i+1; j<n; j++){
                for (int l=j+1; l<n; l++){
                    Tset.add(arr[i] + arr[j] + arr[l]);
                }
            }
        }
        int cnt =0;
        for (int x : Tset){
            cnt++;
            if (cnt==k) return x;
        }
     return answer;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();
        int []arr = new int[n];
        for (int i=0; i<n; i++){
            arr[i] = sc.nextInt();
        }
        System.out.println(solution(n, k, arr));
    }
}
  • Collections.reverseOrder() : 내림차순 정렬
    • 내림차순 정렬을 위해서는 primitive type이 아니라 Wrapper 클래스로 선언해야 한다
  • Arrays.sort(): 오름차순 정렬
    • int,char 같은 primitive type 배열에서 정렬을 지원


참고자료
https://parkmimi.tistory.com/32
https://velog.io/@gillog/Map-컬렉션-HashMap
https://nickjoit.tistory.com/11

profile
개발기록

0개의 댓글