해시 : 완주하지 못한 선수

2dean·2023년 6월 11일
0

Algorithm

목록 보기
11/17

문제

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

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

제한사항

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

입출력 예

participantcompletionreturn
["leo", "kiki", "eden"]["eden", "kiki"]"leo"
["marina", "josipa", "nikola", "vinko", "filipa"]["josipa", "filipa", "marina", "nikola"]"vinko"
["mislav", "stanko", "mislav", "ana"]["stanko", "ana", "mislav"]"mislav"

풀이

import java.util.*;

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

        //완주자 명단
        for (int i=0; i<completion.length; i++) {
            if (completeMap.containsKey(completion[i])) {
                completeMap.put(completion[i], completeMap.get(completion[i]) + 1);
            } else {
                completeMap.put(completion[i], 1);
            }
        }

        for (int i = 0; i< participant.length; i++) {
            if(completeMap.containsKey((participant[i]))){
                if (completeMap.get(participant[i]) > 0) {
                    completeMap.put(participant[i], completeMap.get(participant[i]) - 1);
                } else {
                    // 완주 못함
                    answer = participant[i];
                    break;
                }
            } else {
                // 완주 못함
                answer = participant[i];
                break;
            }
        }
        
        return answer;
    }
}

내가 풀이를 못하는 중 ㅋ

  1. 완주자 명단을 Map에 추가한다. {이름, 1(count)}
  2. 완주자 명단에서 참가자의 이름이 있는지 확인한다. 없으면 미완주자
  3. 완주자 명단에 참가자의 이름이 있으면
    3-1. value가 0보다 크면 count - 1 해준다 {이름, 0}이 됨
    3-2. value가 0보다 작으면 동명이인 완주자가 이미 있었던 것임 -> 미완주자

넘 어려웠다!

다른사람의 멋진 코드

 public String solution(String[] participant, String[] completion) {
        String answer = "";
        HashMap<String, Integer> hm = new HashMap<>();
        for (String player : participant) hm.put(player, hm.getOrDefault(player, 0) + 1);
        for (String player : completion) hm.put(player, hm.get(player) - 1);

        for (String key : hm.keySet()) {
            if (hm.get(key) != 0){
                answer = key;
            }
        }
        return answer;
    }
  • getOrDefault
    찾는 키가 존재한다면 찾는 키의 값을 반환하고 없다면 기본 값을 반환하는 메서드
    위 코드에서 동명이인을 확인하는데 사용함.
    참자자를 Map에 넣으면서 {이름, (기본값=0) + 1}의 형태로 넣어줌, -> {이름, 1} 이됨
    동명이인이 있으면 {이름, (기본값=1) + 1}이 됨 .. 추가있으면 더 되고?
    완주자를 {이름, -1} 해주면서 완주자는 {이름, 0}이 됨
    미 완주자는 {이름, !=0}이된다
  • keySet()
    해당 맵에 포함된 모든 키(key)를 담은 Set 객체를 반환
profile
냅다 써보는 공부의 흔적😇

0개의 댓글