[Python] 완주하지 못한 선수 - 해시

Saemi Min·2023년 2월 8일
0

Programmers Algorithm

목록 보기
8/29
post-thumbnail

문제

해당 문제 링크

풀이

from collections import Counter

def solution(participant, completion):
    answer = ''
    
    a=Counter(participant)
    b=Counter(completion)

    res=a-b

    for i in a.keys():
        if(res[i]>=1):
            answer=i


    return answer

Git

결과

해석

처음 차집합을 사용하면 쉽게 풀릴 것이라고 생각하고 set()함수를 사용하여 집합으로 만든 뒤 p-c로 차집합을 실행했지만, 동명이인이 있을 경우의 오류가 생겼다.
집합으로 선언하면 중복이 불가능하여 동명이인의 한 명은 사라지게 된다.
그렇다면 중복이 있는지 없는지를 리스트에서 확인하려면 어떻게 해야할지 검색해보았다.

    p=set(participant)
    c=set(completion)
    
    
    if len(participant) != len(p):
        print("다름")
    res=p-c
    print(p)
    # print(res)
    print(*res)
        
    print(str(*res))

파이썬 리스트에서 중복을 확인하는 방법을 찾아보니 리스트 중복을 출력하려면 파이썬 내장 모듈인 collections를 이용한다는 것을 알았다.

Counter 함수
"from collections import Counter"
Counter 함수를 이용하면 리스트 중복 갯수를 확인할 수 있다.
Counter는 딕셔너리의 서브 클래스로 딕셔너리처럼 사용할 수 있었다.
이때 아직 딕셔너리도 또한 차집합 개념을 사용할 수 있는지 모르고, 아래와 같이 코드를 작성하였다.
그리하여 나온 결과는 시간 초과 및 답도 맞지 않는 문제에 도달했다.
하지만 코드를 작성하면서 딕셔너리의 사용법에 대해 직접 작성해볼 수 있었다.
이전에 딕셔너리 문법에 대해 학습했지만 실제로 작성하면서 더 와닿았다. 확실히 하나씩 작성해보고 print 찍어보는게 기억에 남는 것 같다.

from collections import Counter

def solution(participant, completion):
    answer = ''
    
    a=Counter(participant)
    b=Counter(completion)

    for i in a.keys():
        for j in b.keys():
            if(i==j):
                a[i]-=1
                
    for i in a.keys():
        if(a[i]>=1):
            answer=i
            
    return answer

이후, 차집합을 써보니, 바로 나오는 것을 보고 코드가 한 번에 줄었다. 그리하여 "풀이"에서 보는 것과 같은 코드를 제출하니 통과하였다.

해시를 사용하는 문제인 것을 알고 푸니 처음 접근을 해시를 이용해서 하고자 생각하다보니 더 접근하기 어렵다는 생각이 들었다. 해시 문제를 하나씩 풀면 감이 올 것이라 생각이 든다.

profile
I believe in myself.

0개의 댓글