[Java] JAVA 코테 풀 때 자주 까먹는 문법 정리
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() 등)을 활용해서 푼 문제들을 모아두었다.
댓글남기기