2/프로그래머스

프로그래머스 연습 문제 - 완주하지 못한 선수

하례은 2020. 9. 8. 01:33

programmers.co.kr/learn/courses/30/lessons/42576

 

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

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

programmers.co.kr

해시 문제

 

def solution(participant, completion):
    maraton = {}
    for i in partivipant:
        maraton[i] = maraton.get(i,0) + 1
    for i in completion:
        maraton[i] -= 1
    answer = [k for k,v in maraton.items() if v == 1]
    return answer[0]

처음에 이용한 방법.

왜인지 -=maraton[i] -= 1 에서 keyError가 나고 테스트 결과는 3가지 중에 한가지밖에 성공하지 않아서 계속 코드를 바꿔줬다. 그래도 안됨... vscode는 가능한데...

아직까지 왜 안되는지 모르겠다..

 

#get()

maraton.get(i,0)  

 

 

 

 

 

~정렬을 이용한 방법

 

def solution(participant, completion):
    participant.sort()
    completion.sort()
    for i in range(len(completion)):
        if participant[i] != completion[i]:
            return participant[i]
    return participant[len(participant)-1]

 

다른 방법을 사용한 것이 정렬 방법. sort()을 통해 오름차순으로 정렬하고 participant와 completion을 비교한다. 이걸 쓰니 바로 정답...

 

#sort()

participant.sort()
completion.sort()

 

오름차순으로 정렬.

 

 

#zip()

for x,y in zip(participent, completion):
	if x != y
    	return x

두 개 이상의 리스트나 스트링을 받아 인덱스에 맞게 for in 문제에서 하나씩 던져줄 수 있다. zip()을 이용하면 range를 이용한것보다 더욱 간단하게 사용가능하다. 

 

 

 

 

 

~ counter을 이용한 방법.

 

문제를 풀고 다른사람이 푼 방법을 봤을때 진짜 감탄했던 방법. 이렇게 풀 수 있구나 하고 한 수 배웠다....

import collections

def solution(participant, completion):
	answer = collections.Counter(participant) - collections.Counter(completion)
    return list(answer.keys())[0]

 

#counter()

import collections

str = "hello"
answer = collections.Counter(str)
print(answer) #Counter({'l': 2, 'h': 1, 'e': 1, 'o': 1})
import collections

str = ["hi","my","hi","apple","name","this"]
answer = collections.Counter(str)
print(answer) #Counter({'hi': 2, 'my': 1, 'apple': 1, 'name': 1, 'this': 1})

항목의 개수를 셀때 사용하는 모듈. 

두개의 카운터가 있을 경우 더할수도, 뺄수도 있고 합집합, 교집합, 차집합 연산이 가능하다.