participant | completion | return |
---|---|---|
["leo", "kiki", "eden"] | ["eden", "kiki"] | "leo" |
=> "leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.
participant | completion | return |
---|---|---|
["marina", "josipa", "nikola", "vinko", "filipa"] | ["josipa", "filipa", "marina", "nikola"] | "vinko" |
=> "vinko"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.
participant | completion | return |
---|---|---|
["mislav", "stanko", "mislav", "ana"] | ["stanko", "ana", "mislav"] | "mislav" |
=> "mislav"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명 밖에 없기 때문에 한 명은 완주하지 못했습니다.
def solution(participant, completion):
completion.sort()
participant.sort()
for i in range(len(participant)):
if participant[i] != completion[i]:
return participant[i]
return participant[-1]
배열을 정렬하는 연산은 O(NlogN)에 비례하는 복잡도를 가짐
=> 테스트는 통과하지만 문제 크기에 비례하는 선형 시간 알고리즘 X
def solution(participant, completion):
d = {}
for x in participant:
# 사전 d에 x가 처음 저장되는 것이라면 O + 1을 사전에 넣고
# x가 이미 존재한다면 원래 값 + 1을 저장
d[x] = d.get(x, 0) + 1
for x in completion:
d[x] -= 1 # 사전에 있는 값을 1씩 뺌
dnf = [k for k, v in d.items() if v > 0] # key(선수 이름)을 담아냄
answer = dnf[0] # 완주하지 못한 선수의 이름
return answer
문제 크기인 N에 비례하는 복잡도를 가짐
line 3-4 : participant 배열 길이에 비례
line 5-6 : 참가자 수인 n에 비례
line 7 : 사전 d의 크기에 비례
=> linear time algorithm
=> hash table을 상수 시간에 읽고 쓸 수 있기 때문에 가능
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
Map <String, Integer> p = new HashMap<String, Integer>();
int count = 0;
for(int i = 0; i < participant.length; i++){
count = p.getOrDefault(participant[i], 0);
p.put(participant[i], count + 1);
}
for(int j = 0; j < completion.length; j++){
count = p.getOrDefault(completion[j], 0);
if(count > 0){
p.put(completion[j], count - 1);
}
}
for(Map.Entry<String, Integer> entry : p.entrySet()){
if(entry.getValue() > 0){
answer += entry.getKey();
break;
}
}
return answer;
}
}
HashMap
을 사용해서 해시를 생성할 수 있음getOrDefault(key, defaultvalue)
를 사용하면 파이썬에서 get
을 사용하는 것과 동일한 결과를 보일 수 있음put(key, value)
을 사용해서 새로운 key-value
값을 넣거나 기존의 key
값의 value
값을 수정할 수 있음entrySet()
으로 해시의 모든 key-value
값을 불러올 수 있음key
값을 가져오고 싶다면 getKey()
value
값을 가져오고 싶다면 getValue()