본문 바로가기
이직준비/Algorithm

[Algorithm] 완주하지 못한 선수 : 프로그래머스 - 해시

by Geunny 2020. 8. 24.
반응형

1. 완주하지 못한 선수

https://www.welcomekakao.com/learn/courses/30/lessons/42576

 

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

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

www.welcomekakao.com

해시 문제의 분류를 힌트로 삼아 HashMap을 이용하여 문제를 해결하고자 노력하였다.

문제는 단순하게 첫번째 배열과 두번째 배열을 비교하여 첫번째 배열중 두번째 배열에서 나타나지 않은 문자열을 찾는 문제이다.

 

풀이는 간단히 해쉬맵에 participant 배열을 key값으로 준 후 해당 key값이 들어올 때마다 value값을 1씩 증가시킨후

두번째 배열의 값으로 해당 맵을 검색한 후 해당 value값을 -1 해주는 방식으로 코드를 구성했다.

 

결국 완주자 명단에 있지 못한 이름은 해당 해쉬맵에서 0이 아닌 값을 갖는 key값이 정답이 된다.

 

import java.util.HashMap;
class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        
        HashMap<String, Integer> map = new HashMap<>();
	        for(String s:participant){
	            if(!map.containsKey(s))
	                map.put(s,1);
	            else
	                map.put(s,map.get(s)+1);
	        }
	        
	        for(String s:completion){
	            if(map.containsKey(s))
	               map.put(s,map.get(s)-1);
	        }
	        for(String s:map.keySet()) {
	        	if(map.get(s)!=0) {
	        		answer=s;
	        	}
	        }
        return answer;
    }
}

인터넷 검색중 위에 작성한 코드중 맵에 값을 넣을때 값이 있는 경우와 없는 경우를 판정하여 값을 넣는 메소드가 있음을 알게 되었다.

그것은 바로 map 의 computeIfAbsent()와 computeIfPresent 매서드 이다.

해당 매서드는 map에 key의 확인 여부에 따라 맵에 넣는 값을 달리 할 수 있다.

위에 if~else로 구성한 코드를 computeIfAbsent() 매서드를 이용하여 아래와 같이 구현이 가능하다.

      // 변경전
            if(!map.containsKey(s))
                map.put(s,1);
            else
                map.put(s,map.get(s)+1);
                
      //메소드 사용
            map.computeIfPresent(s, (String key, Integer value)->++value);
            map.computeIfAbsent(s, key->1);

(근데 어째 쓰고나니까 위가 더 깔끔한거 같기도 하고....)

 

computeIfPresent 매서드의 경우 아래와 같이 파라미터를 갖는다.

computeIfPresent(key, key -> callExpensiveMethodToFindValue(key))

해당 매서드는 이름에서 알수 있듯 맵에 해당 키가 존재할 때 뒤에 value값으로 다시 넣게 된다.

 

해당 매서드는 compute 매서드와 비교되는데

compute 매서드는 키가 존재함의 여부와 관계없이 일단 두번째 파라미터를 해당키에 put 하게 된다.

 

computeifPresent와 마찬가지로 computeIfAbsent 매서드는

맵에 해당 키값이 존재하지 않을 때 값을 넣게된다.

 

해당 매서드도 putIfAbsent 매서드와 비교되는데 이는 위에 비교한 compute매서드와 동일한 맥락으로 진행된다.

 

댓글