HashMap

0

코딩테스트

목록 보기
12/12

HashMap은 Key-Value쌍으로 이루어진 쌍을 저장하는데 유용한 자료구조이다. Set과 다르게 중복처리는 불가하며 보통 입력으로 같은 값이 있는 경우 자주 사용된다.
예전에 배웠지만 주요 메소드의 타입을 까먹고 응용력이 떨어짐을 느껴 다시 정리한다. 이걸 또 해야되? 라는 생각이 듦과 동시에 기반을 확실히 다져 장기기억으로 옮기기 위해서는 정리가 필수이다.

HashMap의 주요 메서드

문제를 풀어보며 사용감을 익혀본다.
본 문제는 가장 기본적이며 HashMap의 용도를 가장 빠르게 익힐 수 있다.

먼저, HashMap의 메소드들을 알 필요가 있다.
1. put(key, value): 지정된 키-값 쌍을 추가, 만약 키가 중복되면 덮어 쓴다!
2. get(key): 키와 대응되는 value를 반환한다. 없으면 null반환

  1. containsKey(key): 지정된 키가 맵에 있으면 true, false반환

  2. containsValue(value): 해당 값과 대응되는 키가 하나 이상 있는지 확인. true, false 반환

  3. remove(key): 해당 key에 매핑된 값 모두 제거. 없으면 아무 작업도 수행하지 않음

  4. keySet(): 맵 내 모든 key를 포함하는 Set반환

    • Set은 Collection의 하위 인터페이스
    • 중복을 허용하지 않는다.
    • 주요 구현체 : HashSet, LinkedHashSet등
  5. values(): 맵 내 모든 value를 포함하는 Collection반환

  6. 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문을 언제 사용해야 코드를 더 간결하게 보이게 할 수 있는지 또한 고민하게 되는 시간이었다.

profile
끊임없이 질문을 던지고 크게 생각하자.

0개의 댓글