본문 바로가기

Python ◡̈/차근차근 Python

[programmers python] Hash 완주하지 못한 선수

 

programmers.co.kr/learn/courses/30/lessons/42576?language=python3

 

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

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

programmers.co.kr

 

 

< problem >

 

 

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

 

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

 

 

< constraints >

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

 


 

< example >

 

 

example 01)

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

 

example 02)

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

 

example 03)

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

 

 


 

< solution ① >

 

participant 배열 값의 수만큼 for문 반복하며, participant가 completion에 포함되지 않는 값 확인하여 return

 


 

ⓒ ⓞ ⓓ 

 


 

ⓣ ⓔ ⓢ 

 


 

동명이인이 존재할 경우, 인지하지 못하고,

null값을 return하게 되어 코드 수정 필요

 

participant와 completion을 모두 정렬 시킨 후 비교 수행

1) participant[i]와 completion[i]가 같지 않다면, participant[i] return

2) 마지막까지 participant와 completion의 값이 모두 같다면, participant[maxNum] return

* len(completion) 계산 반복해서 하면 번거로울 것 예상하여 maxNum 변수 생성 *

 


 

ⓒ ⓞ ⓓ 

 


 

ⓣ ⓔ ⓢ 

 


효율성은 모두 통과했지만, 정확성에서 실패하여 코드 수정 필요

 

len(participant) == 1 인 경우 고려하지 않음

이 부분 코드 고려하여 코드 수정

 


 

ⓒ ⓞ ⓓ 

 


 

ⓣ ⓔ ⓢ 

 


 

< solution ② > zip( ) 활용

 

participant와 completion 배열 정렬 후 반복문 수행

zip( ) 함수 활용하여, 반복문에서 각 배열의 값을 p와 c에 저장

  if 두 값이 같지 않다면 participant의 값이 저장된 p return

  else: participant.pop( ): participant 배열의 수가 1인 경우

 


 

ⓒ ⓞ ⓓ 

 


 

ⓣ ⓔ ⓢ 

 


오히려 이전 코드의 효율성이 조금 더 높다고 판단됨

이전에 알게된 함수 활용해볼 수 있어서 좋았음

 


 

ⓕ ⓘ ⓝ ⓐ ⓛ    ⓒ ⓞ ⓓ ⓔ