반응형
프로그래머스의 코딩테스트 고득점 Kit에 있는 문제 중, 해시파트에 있는 첫번째 문제다.
완주하지 못한 선수 문제 링크
나의 풀이 과정 (오답노트 형식으로 되어있습니다)
첫번째 방법 (실패)
def solution(participant, completion):
for man in completion:
participant.remove(man)
answer = participant[0]
return answer
첫번째로 시도한 방법은 완주한 사람들(completion)의 원소를 읽어와 참여자(participant)에서 하나씩 제거하는 무식한 방법으로 코딩했다. 당연히 정확성 테스트는 통과했지만, 효율성 테스트는 탈락.
두번째 방법(실패)
for man in participant:
if man not in completion:
return man
completion.remove(man)
두번째로는 참여자들을 하나씩 보면서 완주자에 없으면 리턴하도록 코드를 짰다. 첫번째 방법보다 성능은 좋아졌지만 역시나 실패.
마지막 방법(성공)
def solution(participant, completion):
participant.sort()
completion.sort()
for i in range(len(participant)):
if participant[i] != completion[i]:
return participant[i];
마지막 방법으로 생각한 것은 리스트를 정렬하는 것이었다. 일단 리스트를 정렬한후 하나씩 비교해서 다른게 있다면 리턴해주면 될것 같았다. 이렇게 되면 매 루프마다 remove를 하는데 시간을 줄일 수 있다.
참여자 : ['김갑환', '김철수', '나오정', '황찬희']
완주자 : ['김갑환', '김철수', '황찬희']
즉 2번 인덱스에서 서로 값이 다를 것이므로 그때의 참여자 이름을 리턴한다면, 해당 선수가 완주 명단에 없다는 것을 알 수 있을 것이다.
다행히 두개의 테스트를 통과헀다. 다른 사람들의 풀이를 보니깐,
collection의 Counter함수를 사용해 객체의 수를 센 후 빼는 방법으로 해결한 방법도 있는데, 그 방법이 가장 깔끔해보였다.
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
반응형