파이썬 알고리즘/프로그래머스

[프로그래머스] 완주하지 못한 선수(해시 Lv.1)

walbe0528 2022. 1. 15. 23:23
728x90
반응형

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

 

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

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

programmers.co.kr

 

 

개념

파이썬에서 해시(hash)는 딕셔너리 라는 자료구조로 구현할 수 있다.

해시는 언제 사용하는 것이 좋을까??

>>  1. 인덱스 값을 숫자가 아닌 다른값으로 사용하려고 할 때(리스트에서는 원소접근시 list['a']가 불가능하다) 

>>  2. 빠른 접근과 탐색이 필요할때

 

리스트와 딕셔너리의 시간복잡도를 비교하면 아래 사진과 같다.

Dictionary가 List에 비해 빠른 시간복잡도를 갖고 있기에, 원소를 삭제,추가 등이 많을 때에는 딕셔너리를 사용하는 것이 효율적이다. 

시간복잡도 비교

1. get메소드 : 딕셔너리에서 원소를 가져오는 방법이다. 

get(key,x) 의 형태로 사용한다. 

딕셔너리에 key값이 없는경우, x(디폴트값)를 리턴해주면 된다. 

 

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

        # 주어진 키 i가 존재하면 그 값을, 없으면 0(디폴트값)

i가 존재하면 그 값을 리턴해 인원수를 +1해주고, 없다면 0에 +1을 해준다는 의미이다. 

 

 

2. 딕셔너리로 for문 조회하기

2-1. key로만 조회하는 방법

dict = {'apple' : 2, 'banana' : 5, 'grape' : 0}

for key in dict:

      print(key)

 

2-2. items()를 사용해 key, value로 동시 조회하기

for key, value in dict.items():      print(key, value)

 

혹은 

 

result = [k for k, v in dict.items() if v == 0] 

 

3. 딕셔너리 key값 삭제하기 del dict[key]

dict = {'apple' : 2, 'banana' : 5, 'grape' : 0}

del dict['apple']

 

 

 

코드

 

처음에 푼 풀이이다. 시간초과가 떠서 실행이 되지 않았다. 

# 처음 풀이 : 돌아가긴 하나 시간초과 뜸
def solution(participant, completion):
    answer = ''
    for c in completion:
        if c in participant:
            participant.remove(c)
    return participant[0]

 

 

해시(딕셔너리)를 사용해서 풀면 효율적으로 풀 수 있다. 

# 해시 : 이름을 키로 사용, 동명이인의 수를 값
def solution(participant, completion):
    d={}  # 빈사전
    for i in participant:
        d[i] = d.get(i, 0) + 1  # 주어진 키 i가 존재하면 그 값을, 없으면 0(디폴트값)을
        # 처음 등장하면 0+1, 동명이인이라면 기존인원수+1

    for j in completion:
        d[j] -= 1  # 이름 한명씩 빼주기
    result = [k for k, v in d.items() if v>0]  # value가 1인 선수 찾기
    answer = result[0]
    return answer
728x90