2 분 소요


1. Map

HashMap vs TreeMap vs LinkedHashMap

키(key)에 대한 값(value)을 저장하는 자료 구조

key 중복 불가, 중복 시 값 덮어씀

항목 HashMap TreeMap LinkedHashMap
정렬 없음 Key 오름차순 정렬 입력 순서 유지
탐색 속도 O(1) O(log N) O(1)
순회 순서 무작위 정렬된 순서 입력된 순서
내부 구조 해시 테이블 레드블랙 트리 해시 + 연결 리스트
주요 용도 빠른 조회 정렬된 Map 필요 시 순서가 중요한 경우
Map<String, Integer> map1 = new HashMap<>();
Map<String, Integer> map2 = new TreeMap<>();
Map<String, Integer> map3 = new LinkedHashMap<>();

map1.put("banana", 1);
map1.put("apple", 2);
map1.put("cherry", 3);
// 순서: 무작위

map2.put("banana", 1);
map2.put("apple", 2);
map2.put("cherry", 3);
// 순서: apple → banana → cherry (Key 기준 정렬)

map3.put("banana", 1);
map3.put("apple", 2);
map3.put("cherry", 3);
// 순서: banana → apple → cherry (입력 순서 유지)


1.1 HashMap

  • 내부적으로 해시 함수를 사용해 빠르게 탐색이 가능
  • 순서는 보장되지 않음

주요 메서드:

메서드 설명
put(key, value) 키에 해당하는 값을 저장하거나 기존 값을 갱신
get(key) 키에 해당하는 값을 반환함
getOrDefault(key, default) 키가 존재하면 해당 값을, 존재하지 않으면 기본값을 반환
containsKey(key) 해당 키가 맵에 존재하는지 여부를 확인함
// 선언
Map<String, Integer> map = new HashMap<>();

// 값 추가 또는 갱신
map.put("apple", 3);
map.put("banana", 5);

// 값 조회
int a = map.get("apple");           // 3
int b = map.getOrDefault("pear", 0); // 키 없으면 기본값 0 반환

// 키 존재 여부 확인
if (map.containsKey("banana")) {
    System.out.println("바나나 있음!");
}

// 반복 순회
for (String key : map.keySet()) {
    System.out.println("key: " + key);
}

for (Integer value : map.values()) {
    System.out.println("value: " + value);
}

for (Map.Entry<String, Integer> entry : map.entrySet()) {
    System.out.println(entry.getKey() + " -> " + entry.getValue());
}


1.2 TreeMap

  • TreeMap은 key를 자동 정렬해주는 Map 자료구조
  • 내부적으로 Red-Black Tree(이진 탐색 트리) 기반으로 구현
  • firstKey()lastKey()를 통해 최솟값과 최댓값을 O(log N) 에 가져올 수 있음(TreeMap 만 가능)
TreeMap<Integer, Integer> map = new TreeMap<>();

map.put(5, 1);
map.put(2, 1);
map.put(7, 1);

System.out.println(map.firstKey()); // 2 (최솟값)
System.out.println(map.lastKey());  // 7 (최댓값)


1.3 LinkedHashMap

  • HashMap과 동일한 기능 + 입력 순서 유지
  • 내부적으로 이중 연결 리스트를 사용해 key의 삽입 순서를 기억
  • 반복문 순회 시 put()한 순서대로 출력
Map<String, Integer> linkedMap = new LinkedHashMap<>();
linkedMap.put("banana", 2);
linkedMap.put("apple", 5);
linkedMap.put("cherry", 1);

for (String key : linkedMap.keySet()) {
    System.out.println(key);
}
// 출력: banana → apple → cherry

주로 캐시(LRU) 구현 시 사용



2. Sort

자바에서 정렬은 크게 3가지 방식으로 나뉜다.

정렬 기준 사용하는 방식 메서드 예시 백준 문제 해석
기준 1개 (숫자) 단일 기준 정렬 Comparator.comparingInt() 10814 비교기야, 정수형을 기준으로 비교 좀 해줘!
기준 2개 이상 복합 조건 정렬 (a, b) -> {...} + Integer.compare() 11650 두 정수 a, b를 비교해서 누가 더 작은지 알려줘
문자열 사전 순 문자열 비교 compareTo() 1181 이 객체가 상대 객체와 비교했을 때 앞이냐 뒤냐를 알려줘
// 단일 기준
Arrays.sort(arr, Comparator.comparingInt(a -> a[0]));

// 복합 기준
Arrays.sort(arr, (a, b) -> {
    if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
    return Integer.compare(a[0], b[0]);
});

// 문자열 정렬 (List<String>)   // -> Array도 동일
Collections.sort(list, (s1, s2) -> {
    if (s1.length() != s2.length()) return s1.length() - s2.length();
    return s1.compareTo(s2);
});



3. 클래스

클래스나 객체 지향 개념(필드, 생성자, 메서드, toString() 등)을 활용해서 푼 문제들을 모아두었다.


카테고리:

업데이트:

댓글남기기