최대 입력값이 10만으로 시간 복잡도가 O(N) 이나 O(NlogN) 정도인 알고리즘이 필요
동명이인이 없다면 차집합으로 해결할 수 있겠지만 해당 조건이 존재하므로 다른 풀이가 필요
이름에 대해 얼마나 등장했는지 수를 파악
만약이름 대신 번호가 주어졌다면
번호 말고 다른 것(ex: str)로 접근 할 수 있는 자료구조는 없는가?
participant | completion | return |
---|---|---|
["mislav", "stanko", "mislav", "ana"] | ["stanko", "ana", "mislav"] | "mislav" |
part 배열을 살펴보며 hasg 테이블에 등록
mislav 2 stanko 1 ana 1 com 배열에 있는 이름을 hash 테이블에서 제거
mislav 1 stanko 0 ana 0 hash 테이블에 0이 아닌 key 값을 반환
mislav
def solution(participant, completion):
dict = {}
for name in participant:
dict[name] = dict.get(name,0) + 1
for name in completion:
dict[name] -= 1
dnf = [k for k, v in dict.items() if v>0]
answer = dnf[0]
return answer
해시에 접근 하는데 필요한 시간은 O(1) 이므로
참가자를 계산할 때 O(N)의 시간복잡도를 가짐해시에 접근 하는데 필요한 시간은 O(1) 이므로
완주자를 제외할 때 O(N)의 시간복잡도를 가짐완주하지 못한 선수를 찾을 때 O(N)의 시간 복잡도를 가짐
이런 이유로 해당 함수의 시간복잡도는 participant 배열의 길이에 비례하는 linear time 알고리즘이라 할수 있음
def solution(participant, completion):
participant.sort()
completion.sort()
for i in range(len(completion)):
if participant[i] != completion[i]:
return participant[i]
return participant[len(participant)-1]
- participant 배열을 정렬하는데 O(NlogN)의 시간 복잡도를 가짐
- completion 배열을 정렬하는데 O(NlogN)의 시간 복잡도를 가짐
- 두 배열을 0번지부터 원소를 비교 하는데 O(N)의 시간 복잡도를 가짐
이런 이유로 해당 코드에서 sort 함수는 O(NlogN) 복잡도를 가짐