티스토리 뷰

728x90
반응형

 

https://programmers.co.kr/learn/courses/30/lessons/42576

 

코딩테스트 연습 - 완주하지 못한 선수

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

programmers.co.kr

 

 


 

 

<나의 풀이>

from collections import Counter
def solution(participant, completion):
    answer = ''
    answer = Counter(participant) - Counter(completion)

    return list(answer.keys())[0]
'''
< 더 알아보기 >
'''
# Counter 함수 : 개수를 세주는 함수로 해시 가능한 객체를 세기 위한 dict의 서브 클래스
#               요소가 딕셔너리 키로 저장되고 개수가 딕셔너리 값으로 저장되는 컬렉션

# 특히 Counter를 사용하면 뺄셈이 가능하다!! (이번 문제의 KeyPoint) 

# Counter(리스트명)을 print 해보면 ({리스트요소 : 갯수},...) 식으로 나오는 걸 알 수 있다.
# EX) print(Counter(participant)) 
# Counter({'mislav': 2, 'stanko': 1, 'ana': 1})
answer = Counter(participant) - Counter(completion)
print(Counter(participant))

# list로 형변환하는 이유는 요소에 접근하기 위해!
# 전제에 완주하지 못한 사람은 1명이라고 했으니 answer는 언제나 인덱스 0번째밖에 존재하지 않는다.
# 그러므로 요소만 출력하기 위해 뒤에[0]을 붙여줘야한다.
# 뒤에 인덱스를 붙여주지 않으면 list형태로 출력하기 때문에 원하는 답으로 안 나옴(정답 아니라서 실패나옴)
# 같은 이유로 list로 형변환하여 요소로 접근하지 않으면 딕셔너리 형태로 출력되기 때문에 원하는 답으로 안 나옴
return list(answer.keys())[0]

 

정말 많은 것을 배운 문제!

세상엔 정말 코드 잘 짜는 사람들이 많은 것 같다...

모든 풀이를 다 갖고 오고 싶었지만,

가장 도움이 많이 되었던 풀이 두개만 갖고 왔다. 

 

<다른 사람의 풀이>

def solution(participant, completion):
    answer = ''
    temp = 0
    dic = {}

    for part in participant:
        # participant 요소의 해시값을 dic의 key로 넣어주고,
        # participant 요소를 value로 넣어준다.
        dic[hash(part)] = part

        # 해시값을 다 더해준다. 
        temp += hash(part)

    for com in completion:
        # completion 요소들의 해시값을 temp 에서 다 빼준다.
        # 전제에 완주하지 못한 사람은 1명이라고 했으니, 다 빼주고 나면 1명의 해시값만 남는다.
        temp -= hash(com)
    answer = dic[temp]

    return answer
    
    
# <배운점> 
# => 문제 유형처럼 해시를 이용하여 푼 점


'''
< 더 알아보기 >
'''
# 해시 이용 - hash이용
# hash() : 객체의 해시가 있는 경우 해시값을 돌려줌
#          딕셔너리 조회 중에 딕셔너리 키를 빨리 비교하는데 사용
#          같다고 비교되는 값은 같은 해시값을 갖음
#          =>participant의 요소와 completion 요소의 값이 같으면 각각의 요소의 해시값이 같음
# 여기서 해시값이란 ? 해시함수의 출력 결과 값이라고 할 수 있다.



def solution(participant, completion):

    # 각 리스트들을 정렬시켜준다. 
    participant.sort()
    completion.sort()
    for p, c in zip(participant, completion):
        if p != c:
            return p

    # for문을 다 돌았는데 return이 되지 않았다면 p와 c는 완벽히 일치 했을 것이다.
    # 또한 전제에 완주하지 못한 사람은 1명이라고 했으니 p는 언제나 c보다 1명 더 많다.
    # 그러므로 p에 마지막 남은 사람(p인덱스의 가장 끝)이 완주하지 못한 사람이다.
    return participant[-1]
 

# <배운점> 
# => 정렬과 zip을 사용해 문제를 푼 점

728x90
반응형
댓글