출처: https://meyouus.tistory.com/64 [정보 공유 - For Me For You For Us]
본문으로 바로가기

 

맨처음에는 되게 쉬운 문제인줄 알았다. List에서 서로 더해주고 빼주고 하는것만 하면 될듯했기 때문이다. 하지만 아직 문제를 풀면서 나의 실력은 아직 부족하다는 것을 느꼈다.

 

첫번째 시도:

def solution(participant, completion):
    
	failed_list = []
	answer = ''
    
	for i in range(len(participant)):
		if participant[i] not in completion:
			failed_list.append(participant[i])
		else:
			if participant[i] in failed_list:
				pass
			else:
				check_list1 = 0
				check_list2 = 0
				completed_part = []
				for j in range(len(participant)):
					if participant[j] == participant[i]:
						check_list1 += 1
				for k in range(len(completion)):
					if completion[k] == participant[i]:
						check_list2 += 1
				if check_list1 > check_list2:
					for ii in range(check_list1 - check_list2):
						completed_part.append(participant[i])
				failed_list = failed_list + completed_part
        
		answer = answer + str(failed_list)
 
	return answer

 

뭔가 맞게 한듯 하면서도 맞지 않다. 특히 마지막의 answer = answer + str(failed_list)를 고칠 방법을 못 찾았는데, 저렇게 코드를 실행하면 다음과 같은 결과가 나온다

 

여기서 설령 중괄호를 없애보는 방식을 사용해도 결구 " 'leo' " 처럼 나와서 기댓값과 다르다고 말한다. 아무리 사용해도 안되는 것을 보니 뭔가 방식이 잘못되었음을 느끼고 다른 방식으로 접근해보기로 했다. (문제를 제대로 읽지 않은 탓이 크다. 문제에 보면 한명을 제외한 모든 선수들은 완주했다고 한다. 그렇다면 완주 못한 한명만 찾아내면 되는 것인데 그것을 제대로 확인하지 않았다.)

 

두번째 시도:

def solution(participant, solution):
	
    answer = list(set(participant) - set(solution))
    
    return answer[0]

set을 이용하여 간단하게 차이를 빼주면 완주하지 못한 한명이 남게 되지 않을까 싶었다. 하지만 간과한 것은 set은 동일한 element를 중복해서 넣지 않는다. 따라서 다른 방법이 필요하다.

 

 

세번째 시도:

def solution(participant, solution):
	for i in completion:
		if i in participant:
			participant.remove(i)
	return participant[0]

이번에는 더해주는 것이 아닌 빼주는 방식으로 생각했다. Completion에 있는 i가 Participant에도 있으면 Participant에서 i를 없애버리는 방식이다. 이 경우에는, i가 Participant에 중복되게 있어도 한개의 i만 없어지므로 괜찮다. 하지만 정확성 테스트에서는 통과했으나, 효율성 테스트에서는 모두 시간초과가 뜨면서 문제를 틀렸다. 다시 새로운 방식을 생각해보아야 한다.

 

 

네번째 시도 (다른 사람의 풀이 (1)):

def solution(participant, completion):
	
    completion.append("z" * 20)

	for participant_name, completion_name in zip(sorted(participant), sorted(completion)):
		if participant_name != completion_name:
			return participant_name

출처: <itholic.github.io/kata-marathon/>

여기서 작성자는 z*20을 completion의 마지막에 붙임으로써, participant와 completion의 list length를 맞춰준다. 이후, zip이라는 파이썬 내장 함수를 이용해, sorted(participant)와 sorted(completion)를 매칭시켜준다. sorted()함수를 사용하는 이유는 sorted()를 사용해야 같은 이름이 서로가 서로에게 매칭이 되기 때문이다. 이후, participant_name 과 completion_name이 서로 같은지 확인만 해주고, 같지 않은 부분이 나온다면 participant에 중복이름을 가진 이가 탈락했다는 의미이므로, 그 participant_name을 return해주면 된다.

 

 

다섯번째 시도 (다른 사람의 풀이 (2)):

import collections

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

Collections에서 counter라는 함수를 이용해서 간단하게 풀었다. 

 

 


계속 프로그래머스와 백준의 문제를 꾸준히 풀려고 하고 있지만, 아직도 너무나도 부족한 것을 느낀다. 기본기도 계속 다져야 하고, 새로운 방식으로 생각하는 것도 지속적으로 생각할 수 있어야겠다.