[Programmers] 완주하지 못한 선수
- Programming/알고리즘
- 2020. 3. 21. 13:22
###수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
###마라톤에 참여한 선수들의 이름이 담긴 배열 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 |