algo lev-1 완주하지 못한 선수 - 2 (python)
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
(제한 : 참가자 중에는 동명이인이 있을 수 있습니다.)
출처 : 프로그래머스 Level1
다른 사람의 풀이
풀이_1_collection.Counter().py
import collections
def solution(participant, completion):
answer = collections.Counter(participant) - collections.Counter(completion)
return list(answer.keys())[0]
!! 아니 이게 뭐야
Counter()
는 dict
와 같이 hash
형 자료들의 값의 갯수를 셀 때 사용하는데, 딕셔너리 처럼 {‘자료 이름’ : ‘갯수’} 형식으로 만들어 진다!!!!!!!!! 심지어 Counter 객체들끼리 뺄셈도 가능하다 (자세한 건 아래에서)
collections.Counter().py
p = ['mislav', 'stanko', 'mislav', 'ana']
c = ['stanko', 'ana', 'mislav']
print(collections.Counter(p))
# Counter({'mislav': 2, 'stanko': 1, 'ana': 1})
print(collections.Counter(c))
# Counter({'stanko': 1, 'ana': 1, 'mislav': 1})
print(collections.Counter(p) - collections.Counter(c)) # 'mislav'
풀이_2_hash().py
def solution(participant, completion):
answer = ''
temp = 0
dic = {}
for part in participant:
dic[hash(part)] = part
temp += int(hash(part))
for com in completion:
temp -= hash(com)
answer = dic[temp]
return answer
정수형의 hash() 값을 이용한 덧셈과 뺄셈을 이용한 귀여운(ㅋㅋ) 풀이라고 생각했다.
hash() : return the hash value of the object (if it has one)
hash()는 마치 자료들의 주소값처럼(?) 실행될 때마다 각 값에 대한 고유한 정수형 숫자값을 반환한다. 따라서 participant 의 인자들의 hash 값을 모두 더해주고, completion의 인자들의 hash 값을 모두 빼주면 1) 중복됐던 값 중 하나 혹은 2) completion 목록에는 없는 participant의 hash 값이 남는다.
hash().py
participant = ['mislav', 'stanko', 'mislav', 'ana']
ccompletion = ['stanko', 'ana', 'mislav']
# 값들은 실행 할 때마다 달라졌음! (마치 주소값 처럼?)
# 직접 값을 찍어본 결과 값
participant 인자들의 hash 값 : -7255552355678196268 # 'mislav'
participant 인자들의 hash 값 : -3065587020756881512 # 'stanko'
participant 인자들의 hash 값 : -7255552355678196268 # 'mislav'
participant 인자들의 hash 값 : 1818884172576161297 # 'ana'
participant 총합 : -15757807559537112751
completion 인자들의 hash 값 : -3065587020756881512 # 'stanko'
completion 인자들의 hash 값 : 1818884172576161297 # 'ana'
completion 인자들의 hash 값 : -7255552355678196268 # 'mislav'
participant 총합 - completion 총합 : -7255552355678196268 # 'mislav'
배운 점
1) collections.Counter() 모듈에 대해 알게 되었다! 참고
A
Counter
is adict
subclass for counting hashable objects. It is a collection where elements are stored as dictionary keys and their counts are stored as dictionary values.
-
Counter
는dict
자료형의 값들의 개수를 세서 {‘자료 이름’ : ‘갯수’} 형식으로 출력한다 -
0 (zero) 나 음수 (minus)의 값들도 가능
-
Counter() 객체 끼리의 뺄셈도 가능하다 (set의 차집합 처럼)
-
만약 찾고자 하는 값이 없을 경우에도 Counter로 세어주면 에러가 아니라 0 을 반환한다
c = collections.Counter(['A', 'B']) print(c['C']) # 0
-
.most_common([n]) 을 사용하면 많이 나온 빈도수 대로 n개의 결과를 출력해준다
print(collections.Counter('abracadabra').most_common(3)) # [('a', 5), ('r', 2), ('b', 2)
2) hash() 에 대해서 알게 되었다 참고
Hash values are integers. They are used to quickly compare dictionary keys during a dictionary lookup. Numeric values that compare equal have the same hash value (even if they are of different types, as is the case for 1 and 1.0)
-
hash() 는
dict
값들을 빠르게 비교하기 위해서 정수형 숫자를 반환한다. -
숫자들은 자료형이 다르더라도 같은 hash 값을 가진다 (ex. int - 1 / float - 1.0 같은 hash 값을 가짐)
Comments