algo lev-1 완주하지 못한 선수 - 2 (python)

2 minute read

내가 푼 풀이

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 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 a dict subclass for counting hashable objects. It is a collection where elements are stored as dictionary keys and their counts are stored as dictionary values.

  • Counterdict 자료형의 값들의 개수를 세서 {‘자료 이름’ : ‘갯수’} 형식으로 출력한다

  • 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 값을 가짐)

Categories:

Updated:

Comments