출처 https://programmers.co.kr/learn/courses/30/lessons/42576
# participant : 선수들의 이름이 담긴 배열
# completion : 완주한 선수들의 이름이 담긴 배열
# 위의 2개가 주어질 때
# 완주하지 못한 선수의 이름을 return 하는 solution 함수
def solution(participant, completion):
answer = ''
for i in participant:
if i in completion:
continue
else:
answer = i
return answer
처음에는 단순하게 생각해서 participant 중 completion에 없는 이름을 return 해주면 된다고 생각해 코드를 위와 같이 작성하였다.
하지만 코드 실행을 해보니 테스트 케이스의 일부만 통과하고 동명이인이 있는 경우인 통과하지 못 한다는 것을 알게되었다.
participant와 completion에 원소인 이름이 정렬되어야 동명이인을 감지할 수 있겠다는 생각이 들었고 정렬하는 코드를 먼저 작성하고 테스트했다.
participant = ["mislav", "stanko", "mislav", "ana"]
completion = ["stanko", "ana", "mislav"]
participant.sort()
completion.sort()
print(participant)
print(completion)
그리고 같은 이름끼리 일대일 대응되게 묶기 위해 파이썬 내장 함수들을 구글링하였고 zip()을 알게되었다.
def solution(participant, completion):
participant.sort()
completion.sort()
for p, c in zip(participant, completion):
if p != c: #a b b c # a b c # 3번째 zip이 (b, c) 이므로 b 반환
return p
return participant[-1]
정확성 테스트와 효율성 테스트 모두 통과!
return p
case1.
p. sort() 가 ["a", "b", "b", "c"]
c.sort() 가 ["a", "b", "c"] 인 경우
list(zip(p, c)) 실행하면 [(a, a), (b, b), (b, c)] 가 나온다.
위의 for문에서는 (b, c) 가 나온 후 if문으로 인해 b 값를 return하며 solution함수가 끝난다.
case2.
p. sort() 가 [a, b, c, d]
c.sort() 가 [a, c, d] 인 경우
list(zip(p, c)) 실행하면 [(a, a), (b, c), (c, d)] 가 나온다.
위의 for문에서는 (b, c) 가 나온 후 if문으로 인해 b 값를 return하며 solution함수가 끝난다.
return participant[-1] # 동명이인이 없는 case
case1.
p. sort() 가 [a, b, c, d]
c.sort() 가 [a, b, c] 인 경우
list(zip(p, c)) 실행하면 [(a, a), (b, c), (c, d)] 가 나온다.
이 경우 for문을 빠져 나온 후 p[-1]을 return하며 solution함수가 끝난다
import collections
def solution(participant, completion):
answer = collections.Counter(participant) - collections.Counter(completion)
return list(answer.keys())[0]
collections의 Counter를 사용해 처리할 수 있다는 것을 알게 되었다.
list.sort()
sorted(list)
zip(iterable, iterable...)
순회 가능한(iterable) 객체를 인자로 받고, 각 객체가 담고 있는 원소를 tuple의 형태로 차례로 접근할 수 있는 반복자(iterator)를 반환
아래와 같이 여러개 처리 가능하다.
zipTest = list(zip("12345", "ABCDE", "abcde"))
for 문을 이용해 dict으로 묶어줄수도 있다.
dict = {}
for number , name in zip("12345","ABCDE"):
dict[number] = name