데이터 공부를 기록하는 공간

[프로그래머스] Hash - 완주하지 못한 선수 lv1 본문

STUDY/PYTHON _ PROGRAMMERS

[프로그래머스] Hash - 완주하지 못한 선수 lv1

BOTTLE6 2022. 6. 11. 12:27

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


더보기

문제설명

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

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

 

 

제한사항

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

⚫ 자료구조(와 알고리즘)의 선택 

 

✔ 만약 이름 대신 번호 주어졌다면 ? 

  ▶ 선형배열(linear array)를 사용 가능

       정수라면 인덱스로 접근 가능

 

✔ 번호 외(예: 문자열) 로 접근할 수 있는 좋은 자료 구조는 ?  

  ▶ 해시(HASH) 

       : 이름을 키로 해서 테이블의 특정 위치에 

해시 버킷이 많다면, 값들이 같은 해시에 충돌될 일이 적음 

그러나 만약 아래와 같이 충돌된다면, 옆으로 늘어날 수도 있음 (자료구조/알고리즘 수업에서 다루는 내용)

 

participant에 있는 문자의 수를 대응시켜서 더함

completion에 있는 문자를 해시 테이블에 대응시켜 빼줌

▶ "mislav" 의 값이 1로 남아있음


⚫ Python 사전 (dictionary)

✔ 사전의 원소들을 해시를 이용해 O(1) 시간(상수시간)에 접근 가능

 

⚫ 문제풀이

# 동명이인 존재
## 한명만 완주하지 못함
###  
def solution(participant, completion):
    d = {}
    for x in participant:
        # get 메소드 : "d" dictionary 안에 key "x"가 있으면 value를 반환 'x'가 없으면아니면 0을 반환 
        d[x] = d.get(x, 0) + 1 
    for x in completion:
        # "d" dictionary의 key "x"의 value를 1씩 빼준다. 
        d[x] -= 1
    # did not finish
    dnf = [k for k, v in d.items() if v > 0] 
    answer = dnf[0]
    return answer


⚫ 복잡도 : N에 비례하는 복잡도를 가짐 

 for x in participant:
	d[x] = d.get(x, 0) + 1

  ▶ participant 배열의 길이에 비례

for x in completion:
    d[x] -= 1

  ▶ completion 배열의 길이에 비례

dnf = [k for k, v in d.items() if v > 0]

  ▶ 사전"d"의 크기에 비례

 

✔ 해시 테이블을 상수시간에 읽고 쓸 수 있기 때문에 가능


✔ 해시를 쓰는 타이밍은?

✔ 해시를 쓰는 예제


⚫ 다른 풀이 예 : 정렬을 이용한다면? 

def solution(participant, completion):
    participant.sort() #정렬 O(NlogN)
    completion.sort()  #정렬 O(NlogN)
    for i in range(len(completion)):
        if participant[i] != completion[i]:
            return participatn[i]
    return participatn[len(participatn)-1]

✔ 복잡도 O(NlogN) 을 가짐

    테스트를 통과는 하지만, 복잡도가 높아지는 단점이 있음 

Comments