Map 컬렉션은 Key와 Value로 구성된 Entry 객체를 저장하는 구조를 가지고 있다.
키는 중복 저장될 수 없고, 값은 중복 저장될 수 있다. 만약 기존 키와 동일한 키로 값을 저장하면, 새로운 값으로 바뀌게된다.
- Map 컬렉션에서 객체를 추가할때, put(key, value)메소드를 사용하고, key를 이용해 value를 찾아올 때에는 get(key)메소드를 사용하고, 삭제에는 remove(key)메소드를 사용한다.
- 배열과 연결이 결합된 형태.
- hashing 기법을 사용하기 때문에 많은 양의 데이터가 저장될때 유용, 검색에 최고성능을 보인다.
- 추가/삭제/검색/접근성이 모두 뛰어나다.
- 순서가 유지되지 않는다.
(순서유지가 필요하다면 LinkedHashMap을 사용한다.)- Key값은 중복 불가, Value는 중복 가능하다
(만약 기존 키와 동일한 키로 값을 저장하면, 새로운 값으로 바뀌게된다.)
- 집합의 개념으로 인덱스 정보를 포함하고 있지 않음
- 중복 저장 불가
인덱스 정보가 없기 때문에 중복된 원소 중 특정 위치 값을 꺼낼 방법이 없다.- Set은 Collection을 상속받지 않고 별도의 인터페이스를 가진다.
- HashSet: 저장을 위해 해쉬 테이블을 사용한다. 삽입 순서를 유지하지 않는다. 입력순서와 출력 순서가 다르다
- LinkedHashSet: HashSet을 확장한 클래스로 삽입 순서를 유지한다. 입력순서와 출력 순서가 동일하다
- TreeSet: 저장을 위해 트리를 사용한다. 요소들이 정렬되어 있다. 레드-블랙 트리로 구현되어 있다.
입력이 어떻게 되던지 출력은 무조건 오름차순이다
- hashCode()
객체를 기반으로 생성된 위치 값(고유 값)
실제 번지와 다르다- equals()
Object의 equal()은 == 와 동일한 저장 번지 비교
== (등가연산자)는 stack 메모리의 값을 비교
stack메모리에는 참조값 (저장번지)가 들어가져있다
객체가 가리키는 곳이 동일한 메모리 주소일 경우에만 동일한 객체가 된다.
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값을 얻기
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을 리턴
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 + " ");
}
}
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));
}
}
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()
: 내림차순 정렬Arrays.sort()
: 오름차순 정렬참고자료
https://parkmimi.tistory.com/32
https://velog.io/@gillog/Map-컬렉션-HashMap
https://nickjoit.tistory.com/11