Home 프로그래머스 - 완주하지 못한 선수 (MJ)
Post
Cancel

프로그래머스 - 완주하지 못한 선수 (MJ)

#42576. 완주하지 못한 선수

프로그래머스 - 고득점kit - 해시 - Level1

📖Problems

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

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

제한사항

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

입출력 예

participantcompletionreturn
[“leo”, “kiki”, “eden”][“eden”, “kiki”]“leo”
[“marina”, “josipa”, “nikola”, “vinko”, “filipa”][“josipa”, “filipa”, “marina”, “nikola”]“vinko”
[“mislav”, “stanko”, “mislav”, “ana”][“stanko”, “ana”, “mislav”]“mislav”

입출력 예 설명

예제 #1”leo”는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #2”vinko”는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #3”mislav”는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.

🔍Institution

1명만 완주하지 못한다는 것이 포인트인 것 같다. 나머지는 다 같기 때문에 sort해서 인덱스별로 비교하는 방법을 사용했다.

🔍Approach

🚩My submission

  • participantcompletion을 각각 sort()를 통해 정렬한다.
  • completion이 길이가 무조건 -1 더 적으므로 completion길이만큼 for문을 반복하면서 participantcompletion의 index에 해당하는 값이 같은지 아닌지 비교한다.
    • 이때 다르다면 그때 해당하는 participant의 값을 return한다.
  • 반복문을 다 돌았음에도 반환한 게 없다면 participant의 마지막값이 다른 것이므로 가장 마지막 값을 return 한다.
1
2
3
4
5
6
7
8
9
def solution(participant, completion):
    participant.sort() # filipa, josipa, marina, nikola, vinko
    completion.sort()  # filipa, josipa, marina, nikola
    
    for i in range(len(completion)): # 0~2
        if participant[i] != completion[i]: 
            return participant[i]
    
    return participant[-1]

%EC%99%84%EC%A3%BC_%EC%84%A0%EC%88%98_%EA%B2%B0%EA%B3%BC

🚩Others submission

1. collections

1
2
3
4
5
import collections

def solution(participant, completion):
    answer = collections.Counter(participant) - collections.Counter(completion)
    return list(answer.keys())[0] // 리스트 형태로 변환
  • collection 모듈
  • 컨테이너에 들어있는 요소의 갯수를 파악해 딕셔너리 형태로 변환하는 객체 ( {‘자료 이름’ : ‘개수’} 형식 )
  • hash형 자료들의 값의 개수를 셀 때 사용
  • Counter() 객체끼리의 뺄셈도 가능! (이게 치트키 같음)

2. dictionary

1
2
3
4
5
6
7
8
9
10
11
12
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

→ 이 코드는 이해하지 못했는데, 해시를 이용했기 때문에 가져왔다…!

(나중에 이해할 수 있겠지..?)

3. zip

1
2
3
4
5
6
7
def solution(participant, completion):
    participant.sort()
    completion.sort()
    for p, c in zip(participant, completion):
        if p != c:
            return p
    return participant[-1]
  • zip 함수 : Python 내장 함수
  • 같은 인덱스끼리 짝 지어줌 (배열의 길이가 다를 경우 남는 인덱스는 zip 객체에서 제외)

💡Retrospect

  • 새로 알게 된 것: colletion 모듈, zip함수
    • 딕셔너리 형태로 바꾸면 뺄셈도 가능하구나
  • 프로그래머스 걱정했는데 생각보다 쉬워서 놀라웠다. 이 문제는 해시에 해당하는 문제인데 그걸 이용하지 않고 풀어서 좀 아쉽다.
  • 채점할 때 정확성뿐만 아니라 효율성테스트도 해서 신기했다.
This post is licensed under CC BY 4.0 by the author.