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.HashMap;
class Solution {
public String solution(String[] participants, String[] completions) {
HashMap<String, Integer> participantMap = new HashMap<>();
for(String participant: participants) {
participantMap.put(
participant,
participantMap.getOrDefault(participant, 0) + 1
);
}
for(String completion: completions) {
participantMap.put(
completion,
participantMap.get(completion) - 1
);
}
String notCompletedParticipant = "";
for(String participant : participantMap.keySet()) {
if(participantMap.get(participant) == 1) {
notCompletedParticipant = participant;
break;
}
}
return notCompletedParticipant;
}
}
처음에 List를 사용해서 remove 하면되겠다 생각해서 아래와 같이 작성하였다.
class Solution {
public String solution(String[] participants, String[] completions) {
ArrayList<String> participantList =
new ArrayList<>(Arrays.asList(participants));
for(String completion: completions) {
participantList.remove(completion);
}
return participantList.get(0);
}
}
코드는 정상적으로 돌아가지만 시간초과로 틀렸다.
지피티한테 물어본 결과, ArrayList.remove(Object o) 메소드는 리스트의 크기에 비례하는 시간복잡도(O(n))를 가지기 때문에, 전체 시간복잡도는 O(n * m)이 됩니다(n은 참가자 수, m은 완주자 수). 라고 했다.
그래서 HashMap은 평균적으로 O(1) 시간복잡도를 가지므로, 전체 시간복잡도는 O(n + m)이 됩니다. 라고 하여 HashMap을 사용했다.
참가자를 맵으로 만들어서 키는 참가자명, 벨류는 참가자수 저장하여 완주자를 for문으로 돌려 참가자수를 감소시켜 최종적으로 1인 참가자를 찾아서 리턴했다.
시간복잡도를 생각하지 않고 풀었더니 문제 오류가 발생해서 간만에 자료구조와 시간복잡도에 대해 공부하게 되었다.
앞으로 갈길이 멀어보이지만 하나씩 풀어나가야겠다. 아좌좌~