Notion에서 작성된 글이라, 여기에서 더 깔끔하게 보실 수 있습니다! 😮😊
def solution(participant, completion):
participant.sort()
completion.sort()
for i in range(len(completion)):
if participant[i] != completion[i]:
return participant[i]
return participant[-1]
participant
와 completion
을 각각 정렬하고 나서, 같은 인덱스에 존재하는 participant
와 completion
의 값이 다르다면 그 위치에 있는 참가자는 완주하지 못한 선수이다. 문제의 설명을 통해 단 한 명의 선수만 완주하지 못했다는 것을 알 수 있으므로, 바로 return한다.completion
의 길이는 participant
의 길이보다 1 작으므로, completion
의 끝까지 비교했음에도 완주하지 못한 선수를 찾지 못했다는 것은 participant
의 맨 마지막 원소가 완주하지 못한 선수이므로, 이를 return한다.def solution(participant, completion):
p_dict = {}
for p in participant:
if p in p_dict:
p_dict[p] += 1
else:
p_dict[p] = 1
for c in completion:
p_dict[c] -= 1
return [k for k, v in p_dict.items() if v][0]
p_dict
를 만들었다.if c in p_dict:
로 체크해주지 않아도 된다. 이 작업을 마친 뒤 의 value가 1으로 남아 있는 선수가 완주하지 못한 선수이므로, 이를 return한다.def solution(phone_book):
for p in phone_book:
for h in phone_book:
if p.startswith(h) and p != h:
return False
return True
in
은 substring을 확인한다는 점에 주의하여, prefix를 확인할 수 있는 startswith()
를 사용하자.startswith()
를 비슷하게 구현해 보면 다음과 같다.def is_prefix(a, b):
return a[:len(b)] == b
def solution(phone_book):
pb = sorted(phone_book)
for i in range(len(pb)-1):
if pb[i+1].startswith(pb[i]):
return False
return True
정렬을 활용한 방법이다. phone_book
을 정렬하고 나면, 사전순으로 정렬되기 때문에 연속한 두 원소에 대해서만 확인해 주면 된다.
다른 사람의 코드를 보며 배운 부분이 있다. 으로 순회하며 연속된 두 원소에 대해 비교할 때, zip
을 이용하는 부분이었다.
for p1, p2 in zip(pb, pb[1:]):
pb[1:]
로 슬라이싱하는 과정에서 에 가까운 시간이 추가로 소요되어 인덱스로 직접 접근하는 방법에 비해 훨씬 비효율적일 줄 알았다.zip
이 C로 구현되어 매우 최적화되어있고, python interpreter가 zip
을 사용한 루프를 더 잘 최적화할 수 있다고 한다. 실제로 실행 결과도, 인덱스를 이용했던 방식에서 80~90ms가 소요된 TC에서, zip을 이용한 방식은 70~80ms가 소요되었다.def solution(phone_book):
pb_set = set(phone_book)
for pnum in phone_book:
prefix = ''
for p in pnum:
prefix += p
if prefix in pb_set and prefix != pnum:
return False
return True
phone_book
집합 pb_set
을 만든 다음, 각 전화번호에 대해, 그 전화번호의 앞에서부터 한 글자씩 늘려가며 이 prefix가 전화번호부에 등록된 prefix인지 에 확인할 수 있다.for i in range(1, len(pnum)): pnum[:i]
과 같이 매 반복마다 슬라이싱할 경우, 번호의 길이가 20일 때 의 시간이 소요된다.genres
와 plays
의 길이라 하자.def solution(genres, plays):
gp_dict = {}
gp = sorted(enumerate(zip(genres, plays)), key=lambda x: -x[1][1])
for i, song in gp:
if song[0] in gp_dict:
gp_dict[song[0]] += song[1]
else:
gp_dict[song[0]] = song[1]
gp_total = sorted(gp_dict.keys(), key=lambda x: -gp_dict[x])
answer = []
for g in gp_total:
idx = []
for i, song in gp:
if song[0] == g: idx.append(i)
if len(idx) == 2: break
answer.extend(idx)
return answer