문제 설명
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
제한사항
입출력 예
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" |
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
ArrayList<String> list = new ArrayList<>(Arrays.asList(participant));
for(String c : completion) {
if(list.contains(c)) {
list.remove(c);
}
}
return list.get(0);
}
}
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
String ans = "";
Map<String, Integer> map = new HashMap<>();
for(String p : participant) {
map.put(p,map.getOrDefault(p, 0) +1);
}
for(String c : completion) {
map.put(c, map.get(c)-1);
}
for(String k : map.keySet()) {
if(map.get(k) != 0) {
ans = k;
}
}
return ans;
}
}
List
활용 풀이는 테스트 케이스는 전부 통과했으나 효율성 테스트는 전부 통과하지 못했다. Hash
를 오랜만에 쓰는데 단순하게 풀 수 있는 문제라, 이름에 디폴트로 1을 넣고 completion 배열로 다시 1을 차감해서 0이 아닌 사람을 반환하게 구현했다.Map<String, Integer> map = new HashMap<>();
for(String p : participant) {
map.put(p,1);
}
Map
클래스의 getOrDefault
메서드를 많이들 쓴다. 이 메서드는 찾는 키가 있으면 그 키에 매핑된 값을, 그렇지 않다면 디폴트 값을 반환한다.Map<String, Integer> map = new HashMap<>();
for(String p : participant) {
map.put(p,map.getOrDefault(p, 0) +1);
}
String p
가 있으면 p에 매핑된 값 +1
을, 그렇지 않다면 디폴트값 0 +1
을 반환하는 것이다. 동명이인이 나타날 때마다 같은 매핑 값을 몇 번이고 증가시켜줘야 하기 때문에 .getOrDefault(p, 1)
이 아니라 .getOrDefault(p,0)+1
방식으로 쓴다.