algo lev-1 완주하지 못한 선수 (python)

1 minute read

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

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

(제한 : 참가자 중에는 동명이인이 있을 수 있습니다.)

출처 : 프로그래머스 Level1

내가 푼 풀이

간단하게 차집합을 구하면 될 것 같아서, set을 이용했다. 그런데 문제의 조건에서 동명이인을 다르게 처리해야 하는데, set은 중복을 제거해 버린다. 그래서 몇몇 케이스에서 오답처리가 되었다.

1차 시도.py (오답!!)

def solution(s, c):
    set1 = set(s) - set(c)
    if list(set1):
        return list(set1)[0]  
    	# 안에 있는 값만 뽑아내기 위해서 list()로 변환
        # 완주하지 못한 단 한 명이기 때문에 [0] 해줬음
    else : 
        return 0  # 런타임에러 방지

어떻게 해야 할 지 고민하다가, dictionary에 값을 넣어 비교하는 형식으로 풀었다. 그런데 역시 … 시간이 초과돼서 오답 처리…!!!! 으으

2차 시도.c (시간초과…ㅠ)

def solution(s,c):
    dic1 = {i : 0 for i in s}

    for i in s :
        for j in dic1.keys(): 
            if i == j :			# 참가자들 중,
                dic1[i] += 1    # 중복된 값 체크

    for i in c :
        for j in dic1.keys():
            if i == j :
                dic1[i] -= 1
                
    for i in dic1.keys() :
        if dic1[i] > 0 :        
            # 완주한 선수 목록에 없다면, 1이 나올테니까
            # dic1[i] > 0
            return i

    return 0

검색하다가 zip() 을 알게 됐는데, 정렬을 해보면 차이점을 찾을 수 있을 것 같았다.

  • 예시 1) 동명이인이 있다면, zip 안에 있는 값이 다른 것이 있기 때문에 그 다른 것들 중 하나가 답이 되거나
  • 예시 2) 모두 같거나, 중복된 것이 맨 뒤에 정렬됐다면 길이가 하나 차이 나는 s의 마지막 값이 답이 된다.

3차 시도.py (성공!!)

def solution(s,c):

    s.sort()
    c.sort()

    for par, com in zip(s, c) :
        if par != com :
            return par   # 예시 1번

    return s[-1]         # 예시 2번
# 예시 1번
A = ['a','b','b','c'] 
B = ['a','b','c']
zip(A, B)  # [('a','a'), ('b','b'), ('b','c')]  # 차이 발생

# 예시 2번 - 1
A = ['a','b','c','c']   # 마지막 값
B = ['a','b','c']
zip(A, B)  # [('a','a'), ('b','b'), ('c','c')]

# 예시 2번 -2
A = ['a','b','c']       # 마지막 값
B = ['a','b]
zip(A, B)  # [('a','a'), ('b','b')]

다른 사람의 풀이 & 배운점

Categories:

Updated:

Comments