코딩 테스트/프로그래머스

[Python] 프로그래머스 lv.1 완주하지 못한 선수

위시리 2024. 10. 8. 00:46

알고리즘 고득점 kit - 해시 - lv 1

 

문제분석

  • 단 한명의 선수만 마라톤을 완주하지 못함
  • 완주하지 못한 선수의 이름 return

 

코드 설계

  • completion 의 값을 돌면서 확인
  • 있으면 없애기 (하나만)
  • participant 에 남아있는 이름 return

 

정답 코드

1차 - 실패 (시간초과)

def solution(participant, completion):
    for i in completion:
        participant.remove(i)
    answer = "".join(participant)
    return answer

 

2차

def solution(participant, completion):
    participant.sort()
    completion.sort()

    for i in range(len(completion)):
        if participant[i] != completion[i]:
            return participant[i]

    return participant[-1]
  • 정렬 후 같은 index에 대한 값이 다르면 해당 참가자 return
  • 마지막 인덱스까지 같다면 
  • 마지막 사람이 완주하지 못한 것

 

다른 사람 코드 1

collections

import collections

def sol (participant, completion) :
    ans = collections.Counter(participant) - collections.Counter(completion)
    return list(ans.keys())[0]
  • list(ans.keys())[0]
    • ans는 Counter의 객체로 내부적으로 dictionary처럼 동작
    • ans.keys() 는 Counter 객체에서 키들의 뷰를 반환
    • 이후 dict_keys 객체를 리스트로 변환
    • dict_keys는 리스트와 유사하나, 인덱싱이나 슬라이싱을 직접 지원하지 않으므로 list( )를 사용해 명시적으로 리스트로 변환한 뒤, [0]으로 리스트의 첫번째 요소인 첫 번째 키를 가져온다.

 

  • collections.Counter :  요소들의 개수를 세는 데 사용된다. 리스트나 문자열과 같은 반복 가능한 객체에서 각 요소가 몇 번 등장했는지 쉽게 셀 수 있다.
import collections

lst = ['a', 'b', 'c', 'a', 'b', 'b']
cnt = collections.Counter(lst)
print(cnt)

# result : Counter({'b': 3, 'a': 2, 'c': 1})

 

다른 사람 코드 2

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

participant 리스트를 순회하면서:

  • 각 선수의 해시값을 계산하여 딕셔너리 dic에 저장
    • dic[hash(part)] = part는 선수 이름 part의 해시값을 키로 하고, part를 값으로 저장
  • 선수의 해시값을 temp에 더합니다.
    • 이로써 모든 선수의 해시값의 합이 temp에 저장됩니다.

completion 리스트를 순회하면서:

  • 완주한 선수의 해시값을 temp에서 뺌
  • 이렇게 하면, temp에는 완주하지 못한 선수의 해시값만 남게 됨

따라서 최종적으로 완주하지 못한 선수의 이름 반환

 

다른 사람 코드 3

def solution(participant, completion):
    participant.sort()
    completion.sort()
    for i in range(len(completion)):
        if participant[i] != completion[i]:
            return participant[i]
    return participant[len(participant)-1]

 

다른 사람 코드 4

def solution(participant, completion):
    participant.sort()
    completion.sort()
    for p, c in zip(participant, completion):
        if p != c:
            return p
    return participant[-1]

 

 

2차 풀이 - 2024.11.24

1차 - 테스트는 통과했으나 효율성 실패 (시간초과)

def solution(participant, completion):
    participant.sort()
    completion.sort()
    
    for c in completion : 
        participant.remove(c)
    return ''.join(participant)

 

2차

from collections import Counter

def solution(participant, completion):
    answer = Counter(participant) - Counter(completion)
    
    return list(answer.keys())[0]

 

 

3차 - 25.03.26

해설 코드

def solution(participant, completion):
    answer = ''
    part = {}
    for i in participant:
        # 동명이 있다면
        if i in part:
            part[i] += 1 # 추가
        else:
            part[i] = 1 # 생성
    # 완주자들 체크
    for i in completion:
        part[i] -= 1
        if part[i] == 0:
            del part[i]

    return list(part)[0]