본문 바로가기

퇴근후공부/코딩테스트공부

[JAVA]Map - getOrDefault 핵꿀함수!!! 사용법

getOrDefault( Object key,V defaultValue )

- Java 8에서 추가된 Collection API 함수들 중 일부이다.
찾는 key가 존재한다면 찾는 key의 value를 반환하고, 없거나 null이면 default 값을 반환한다.

약간 SQL로 치면 NVL같이 null일경우 대체값으로 치환 뭐 이런느낌이랄까?
대신 이건 containsKey함수기능까지 내포하고있으므로 훨씬효율적이다!!!

ex)
String[] abc = { "a", "b", "c" };
HashMap<String,Integer> map = new HashMap<>();
for(String key : abc) {
    map.put(key, map.getOrDefault(key,0) +1);
}

https://programmers.co.kr/learn/courses/30/lessons/42576

 

코딩테스트 연습 - 완주하지 못한 선수

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수

programmers.co.kr

 

프로그래머스의 해쉬관련 문제 중 완주하지 못한 선수라는 문제를 풀었는데

진짜 답안 하나도 안보고 풀고나서(성공!) 다른분들의 풀이를 봤더니

내가 하드코딩했던 로직이 이미 java8에서 함수로 구현되어있다는 것을 보고 머리를 쿵 얻어맞은듯!했다.

역시 공부를 해야해...ㅋㅋㅋ

 

import java.util.*;
class Solution {
    public String solution(String[] participant, String[] completion) {
        HashMap<String,Integer> p_map = new HashMap<String,Integer>();//참가자목록
        int baseCnt = 1;  
        String answer = "";       
      for(String el : participant){
   
          if(p_map.containsKey(el)){              
              int newCnt = p_map.get(el) +1;
              p_map.put(el,newCnt);      //기존에 존재하는키면 갯수 늘려줌 동명이인           
          }else{
              p_map.put(el,baseCnt);  //동명이인아님    
          }        
      } 
        
      for(String com_name: completion){
          if(p_map.containsKey(com_name) ){ //참가자수 1 다운시켜주기
              int currentCnt = p_map.get(com_name);
              p_map.put(com_name,currentCnt -1);
          }
      }  

      Set<String> keys = p_map.keySet();
      for (String key : keys) {
            if(p_map.get(key) >0){
                answer= key;
            }
       }
 
       
      return answer;
 }
}

 

내 코드를 보면 기본적으로 이름당 value를  디폴트 1로 부여해주고 동명이인일경우 현재값의 +1값으로 증가시켜주는 로직이있다.

 if(p_map.containsKey(el)){              
     int newCnt = p_map.get(el) +1;
     p_map.put(el,newCnt);      //기존에 존재하는키면 갯수 늘려줌 동명이인           
 }else{
      p_map.put(el,baseCnt);  //동명이인아님    
}

 

 

내가 만약 getOrDefault 함수를 알아서 이걸 활용했다면 정말간단하게 

   p_map.put( el, p_map.getOrDefault(el,0) +1 );

이 한 줄이면 됐을 것이다.

초깔끔....

 

역시... 

게으른 개발자들이 세상을 바꾼다!!!!!!!!