- 오늘의 학습 키워드 : map
- Map의 특징
- Map은 선언 시 <key, value>로 값을 넣음
- Key와 Value는 한 쌍으로 Key로 식별, Value에 사용할 값을 넣는 식
- Key는 중복 불가, 동일한 Key 값을 넎으면 최근에 넣은 값이 적용
Map의 주요 메소드
Map 안에 값 넣기 Map.put(key, value);
Map 안의 값 가져오기 Map.get(key);
Map 크기 확인
Map.size();
Map 안의 내용 변경
Map.replace(key, value);
Map 안에 특정 Key, Value 들었는지 확인
Map.containsKey(key);
Map.containsValue(value);
Map의 크기가 0인지 확인
Map.isEmpty();
Map 안의 내용 삭제
Map.remove(key);
Key가 있으면 Value 없으면 default 호출
Map.getOrDefault(key, default);
- Map에 key에 해당하는 값이 없을 경우 default 호출
Key가 없거나 Value가 null일때만 삽입
Map.putIfAbsent(key, value);
Map은 선언 시
HashMap, TreeMap, HashTable, LinkedHashMap으로 선언 가능
HashMap
- Map 안에서 key/value에 따른 순서 없음
TreeMap
- key 값에 따라 오름차순 정렬,
정렬 때문에 대량의 데이터 삽입/삭제시 오래 걸림
LinkedHashMap
- 삽입 순서에 따라 정렬
HashTable
- key/value에 null을 넣을 수 없음,
동기화(synchronized) 되어있음
오늘의 문제
- Sol1
class Solution {
public boolean isValid(String s) {
Map<Character, Character> map = Map.of(')', '(', '}', '{', ']', '[');
Stack<Character> stack = new Stack<>();
for (Character c : s.toCharArray()) {
if (c == '(' || c == '{' || c == '[') {
stack.push(c);
} else if (stack.isEmpty() || stack.pop() != map.get(c)) {
return false;
}
}
return stack.isEmpty();
}
}
- 여는 괄호가 나오면 닫는 괄호가 반드시 나오고 (는 )와 {는 }와 [는 ]와 매칭이 되어야 한다.
- 스택 이용하여 여는 괄호가 나오면 그대로 Stack에 넣어주고, 닫는 괄호가 나오면 Stack.peek()값과 비교하여 쌍이 제대로 맞는지 확인
- 단순하게 switch문이나 if-else문으로 짤수도 있고 HashMap을 사용하여 반복되는 로직 줄일 수도 있다.
- key = 닫는 괄호, value 여는 괄호로 저장해두고 닫는 괄호가 주어지면 stack의 가장 최근 값이 여는 괄호와 일치하는지 비교
- Sol2
import java.util.*;
class Solution {
public boolean isValid(String s) {
Stack<Character> st = new Stack<>();
for (int i = 0 ; i < s.length(); i++) {
char c = s.charAt(i);
char item;
if (c == '(' || c == '{' || c == '[') st.push(c);
else {
try {
item = st.pop();
} catch (EmptyStackException e) {
return false;
}
if ((c == ')' && item != '(') || (c == '}' && item != '{') || (c == ']' && item != '[')) {
return false;
}
}
}
return st.isEmpty();
}
}