강의로 돌아가기
Tama74

파이썬 효율성 조언좀 부탁드립니다

효율성을 어떡게 높일 수 있을까요

작성중인 코드―solution.py
1
2
3
4
5
6
def solution(participant, completion):
    participant.sort()
    completion.sort()
    for i in completion:
        del participant[participant.index(i)]
    return participant[0]
  • Leni
    del로 객체 삭제를 하기 보다는 sort()하셨으니 같지 않으면 동명이인인 경우에도 완주하지 못한사람입니다. 아래 답변 남겨두었으니 도움 되길 바랍니다 :) Leni 2019.01.03 15:40
2 개의 답변
조연식

우선 저는 효율성 4번째 까지는 해결했습니다.

set 자료형을 이용하는 방식인데, list -> set을 사용하면 자동으로 중복된 데이터는 삭제됩니다.

케이스를 두개로 나눠서,

if len(set(participant)) == len(set(completion)):

True => 동명이인이 답인경우,

False => 그렇지 않은 경우.

False의 경우, 훨씬 쉬워지는데,
단순히 participant에는 있는데, completion에 없는 이름 찾기로 문제가 바뀌니까.
list-> set으로 중복 없애고 차집합 연산하면 답이 나옵니다.
그러면 효율성 5개중 앞에 4개는 해결됩니다.

마지막 효율성 문제는 추측상 동명이인이 여러개인 경우에 대한 것이지 않을까 싶은데...
저도 푸는 중이라...

  • Leni
    동명이인 여러명인 경우는 sort() 후 비교를 하여 해결하였습니다 :) 아래 답변이 도움이 되시길 바랍니다 :) Leni 2019.01.03 15:45
Leni

[ Tama74님 ]

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

    # 수정할 부분 - - - -
    for i in completion:
        del participant[participant.index(i)]
    return participant[0]
    # 수정할 부분 - - - -

해당 부분을

for index in range(len(completion)):
            if completion[index] != participant[index]:
                # 동명이인 중에 완주 못한 사람 체크
                return participant[index]

        # 동명이인이고 완주를 하지 못했으나 이름 상 제일 뒤에 있는 사람인 경우 체크
        # 예시) 정렬된 후의 변수가 participant['a', 'b', 'b', 'z', 'z'] / completion['a', 'b', 'b', 'z'] 인 경우
        return participant[-1]

로 해주시면 동명이인이 여러명인 부분도 해결 가능합니다.

물론 효율성 부분값도 수정은 되긴하나 [ 조연식 ] 님이 말씀해주신대로
set()과 [ Tama74 ] 님께서 사용하신 sort() 후 비교 부분을 섞어서 사용하시면 효율성 및 동작시간이 크게 줍니다 :)

답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.