HashMap은 Key-Value쌍으로 이루어진 쌍을 저장하는데 유용한 자료구조이다. Set과 다르게 중복처리는 불가하며 보통 입력으로 같은 값이 있는 경우 자주 사용된다.
예전에 배웠지만 주요 메소드의 타입을 까먹고 응용력이 떨어짐을 느껴 다시 정리한다. 이걸 또 해야되? 라는 생각이 듦과 동시에 기반을 확실히 다져 장기기억으로 옮기기 위해서는 정리가 필수이다.
문제를 풀어보며 사용감을 익혀본다.
본 문제는 가장 기본적이며 HashMap
의 용도를 가장 빠르게 익힐 수 있다.
먼저, HashMap
의 메소드들을 알 필요가 있다.
1. put(key, value)
: 지정된 키-값 쌍을 추가, 만약 키가 중복되면 덮어 쓴다!
2. get(key)
: 키와 대응되는 value를 반환한다. 없으면 null
반환
containsKey(key)
: 지정된 키가 맵에 있으면 true, false반환
containsValue(value)
: 해당 값과 대응되는 키가 하나 이상 있는지 확인. true, false 반환
remove(key)
: 해당 key에 매핑된 값 모두 제거. 없으면 아무 작업도 수행하지 않음
keySet()
: 맵 내 모든 key를 포함하는 Set
반환
values()
: 맵 내 모든 value를 포함하는 Collection
반환
entrySet()
: 맵 내 모든 키-값 쌍을 포한하는 Set
반환
이제 문제를 본다. 참가자에서 완주자를 뺀 나머지를 구한다.
이때 주의해야 할 점은 동명이인, 즉, participant중에 같은 키 값이 있다는 것이다.
Set에 participant를 넣어버리면 이 동명이인이 처리가 되지 않는다.
이를 위해 HashMap을 선택한 것이다.
HashMap에 값을 넣되, 원래와 같은 키값이 삽입되면 value+1을 하는 것이 키 포인트이다.
즉, completion에 있는 완주자들이 있다면 해당 키(완주자)에 해당하는 값을 -1해준다.
그리고 keySet()으로 키들을 모두 가져와 value가 1이상인 참가자들을 출력하면 정답이 된다.
import java.util.*;
import java.util.stream.*;
class Solution {
public String solution(String[] participant, String[] completion) {
Map<String,Integer> map = new HashMap<>();
for(String a : participant){
if(map.containsKey(a)){
map.put(a,map.get(a)+1);
}else{
map.put(a,1);
}
}
for(String b: completion){
if(map.containsKey(b)){
map.put(b,map.get(b)-1);
}
}
for(String key: map.keySet()){
if(map.get(key)>0){ //key에 대응하는 값이 0이상인 키 모두 리턴
return key;
}
}
return null;
}
}
본 문제를 통해 사용하고자하는 자료구조에 대한 메소드들의 반환값을 숙지하는 것이 중요하다고 느꼈다. 또한 for-each문을 언제 사용해야 코드를 더 간결하게 보이게 할 수 있는지 또한 고민하게 되는 시간이었다.