[Programmers] 완주하지 못한 선수

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

###마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 ###이름을 return 하도록 solution 함수를 작성해주세요.

제한사항
마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
completion의 길이는 participant의 길이보다 1 작습니다.
참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
참가자 중에는 동명이인이 있을 수 있습니다.
입출력 예
participant completion return
[leo, kiki, eden] [eden, kiki] leo
[marina, josipa, nikola, vinko, filipa] [josipa, filipa, marina, nikola] vinko
[mislav, stanko, mislav, ana] [stanko, ana, mislav] mislav

입출력 예 설명
예제 #1
leo는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.
예제 #2
vinko는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.
예제 #3
mislav는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.

  • 코드 작성
import java.util.HashMap;  
import java.util.Map;

class Solution {  
    public String solution(String\[\] participant, String\[\] completion) {  
        String answer = "";  
        Map<String,Integer> myMap = new HashMap<String,Integer>();


        for(int i=0;i<participant.length;i++) {
            if(myMap.get(participant[i])==null) {
                myMap.put(participant[i], 1);
            }else {
                int cnt = myMap.get(participant[i]) + 1;
                myMap.put(participant[i], cnt);    
            }
        }

        for(int i=0;i<completion.length;i++) {
            int cnt =myMap.get(completion[i]);
            if(cnt>1) {
                myMap.put(completion[i],myMap.get(completion[i])-1);
            }else if(cnt==1) {
                myMap.remove(completion[i]);
            }
        }

        for(String item : myMap.keySet()) {
            answer = item;
        }
        return answer;
    }
}

풀이

  • Hashmap을 활용한 풀이
    Hashmap에 선수 순서대로 입력, 선수이름을 키로 값을 숫자(동명이인이 있을 수 있음으로)

    HashMap에서 완주한 선수를 제거
    1명 이상이면 숫자를 -1 처리
    1명 존재하면 완주한 선수를 map에서 값 자체를 존재

    모두 제거하면 완주하지 못한 선수만이 존재한다.
    완주하지 못한 선수 이름은 keySet임으로 KeySet에서 값을 가져온다.

  • 문제 특징 : 동명이인의 선수가 존재할 수 있다!!,

  • 중복의 특징을 무시해야할 필요가 있을 땐 HashSet으로 해결해 볼 수 있지 않을까?

'Programming > 알고리즘' 카테고리의 다른 글

[Leetcode] Split Array Largest Sum  (0) 2020.03.29
Leetcode : Two Sum 2  (0) 2020.03.29

댓글

Designed by JB FACTORY