on
해시 - 완주하지 못한 선수
해시 - 완주하지 못한 선수
문제 설명
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때,
완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
제한사항
마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
completion의 길이는 participant의 길이보다 1 작습니다.
참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
참가자 중에는 동명이인이 있을 수 있습니다.
입출력 예
participant completion return #1 ["leo", "kiki", "eden"] ["eden", "kiki"] "leo" #2 ["marina", "josipa", "nikola", "vinko", "filipa"] ["josipa", "filipa", "marina", "nikola"] "vinko" #3 ["mislav", "stanko", "mislav", "ana"] ["stanko", "ana", "mislav"] "mislav"
#1 : "leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.
#2 : "vinko"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.
#3 : "mislav"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한 명은 완주하지 못했습니다.
해결
import java.util.HashMap; import java.util.Map; public class Solution1 { public String solution(String[] participant, String[] completion) { String answer = ""; Map map = new HashMap<>(); // 1) for (String player : participant) map.put(player, map.getOrDefault(player, 0) + 1); // 2) for (String player : completion) map.put(player, map.get(player) - 1); // 3) for (String key : map.keySet()) { if (map.get(key) != 0) { answer = key; } } return answer; } }
풀이
지금부터 매개변수로 주어지는 배열 participant는 [참여자] completion은 [완주자] 라고 표현하겠다.
1)
먼저 Map 객체의 key로 사람 이름(String)과 value로 동명이인 수(Integer)를 함께 담는다.
[참여자] 배열의 모든값을 for each 문으로 돌아 Map 객체에 담는 과정에서 A라는 사람을 담는다고 할 때
Map에 담은 사람 중에 A라는 사람이 있었다면 해당 값을 담고 +1을 해준다.
HashMap은 중복이 되지 않기에 기존 값을 덮어씌워 A라는 key는 마지막으로 put한 하나만 존재하게 된다.
이전에 A라는 사람이 없었다면 A를 담으며 기본값 0을 담으며 +1 해준다.
이런 방식으로 Map에 담으면 A라는 이름을 가진 사람이 3명일 때 key는 'A', value는 3으로 담기게 될 것이다.
2)
이번엔 [완주자] 배열의 모든 값을 for each 문으로 돌아 Map객체에 [완주자] 배열의 값인 사람 이름(String)을 key로 담고
value로 해당 이름을 가진 동명이인 수(Integer) value값을 가져와 -1을 해주어 담는다.
3)
한 명만 완주하지 못했기 때문에 [완주자]에는 [참여자] 한명만 없는 상황이다.
그렇다면 위 코드를 진행했을 때 value값이 -1 되지 않은 하나의 key만 찾으면 되는 것이다.
위에서 담은 A라는 3명의 동명이인이 모두 완주했다면 -1씩 3번 되어 0이 되었을 것이다.
그러나 A 한 명이 완주하지 못했다면 key가 A인 value는 1이 되었을 것이다.
이를 구현하기 위해 Map 객체의 keySet() 메소드를 사용해 key 목록을 구하고
이를 for each문으로 반복해 get()의 매개변수로 사용해 value를 구해 0이 아닌 값을 찾으면 된다.
from http://0giri.tistory.com/33 by ccl(A) rewrite - 2021-10-04 02:28:00