코딩테스트 고득점 Kit - 해시 문제


✔️ 문제 설명

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

제한사항

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


✔️ 문제 풀이

(1) Pseudo-Code

- 참가자 명단과 완주자 명단이 주어진다.
- 참가자 명단에는 완주자 명단보다 1명 더 많다.
- 동명이인이 있을 수 있다.

1. 참가자 명단과 완주자 명단을 sort로 정렬한다.
2. 우선, 참가자 명단의 마지막 값을 answer로 지정한다.
👉 만약, 참가자 명단에서 마지막 값이 answer일 수 있으니 위와 같이 설정한다.
3. for문으로 참가자 명단과 완주자 명단에서 같은 인덱스값을 가지는 이름이 같다면 패스한다.
4. 같은 인덱스 값을 가지지만, 이름이 다르다면 answer에 해당 참가자 명단의 이름을 할당한다.

(2) 코드 작성

def solution(participant, completion):
    # 참가자와 완주자 명단 정렬
    part = sorted(participant)
    comp = sorted(completion)
    # 우선, 정렬 기준 앞에서 값이 다 같을수 있기 때문에 마지막 값으로 할당
    answer = part[-1]

    # 같은 위치, 같은 값이면 패스하고 같은 위치 다른 값이면 그 요소를 정답 변수에 할당
    for i in range(len(comp)):
        if part[i] == comp[i]:
            pass
        elif part[i] != comp[i]:
            answer = part[i]
            break

    return answer

(3) 코드 결과

  • 성능 요약 : 메모리 26.3 MB, 시간 70.00 ms
  • 채점결과 : 정확성 50.0, 효율성 50.0, 합계 100.0/100.0

(4) 코드 리뷰

  • 처음에 코드를 작성할 때, for 문과 remove 를 같이 써서 코드 실행시 3개의 문제는 합격했지만 효율이 떨어진다는 이유로 채점하기를 눌렀을 때 탈락했다.
  • for문과 remove를 같이 썼을 때, 효율이 떨어지는 이유에 대해 알아보았는데 시간복잡도를 갖게 되어 효율성이 0점이 나온다는 사실을 알게되었다.
  • 다른 형태의 코드를 생각해 본다면, for문에서 zip을 이용해서도 쓸 수 있을 것 같다.


👩🏻‍💻개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다.

댓글남기기