1 분 소요

문제 링크

내 풀이

def solution(n, lost, reserve):
    copied = []
    for man in reserve:
        if man in lost:
            copied.append(man)
            lost.remove(man)
    for copy in copied:
        reserve.remove(copy)
    lost.sort()
    for man in reserve:
        if man - 1 in lost:
            lost.remove(man-1)
        elif man + 1 in lost:
            lost.remove(man+1)
            
    return n - len(lost)

다른 풀이

def solution(n, lost, reserve):
    
    #여벌 가져온 학생이 도난당한 번호 찾기
    spare_stolen = set(lost) & set(reserve)
    
    #spare_stolen로 겹치는거 제거해주기
    # +정렬해주기!!!(앞번호부터 비교해야하기 때문)
    lost = sorted(list(filter(lambda x : x not in spare_stolen, lost)))
    reserve = sorted(list(filter(lambda x : x not in spare_stolen, reserve)))
    
    #lost만큼 for문 돌려주기 
    #여벌을 못빌리면 n = n - 1 해주기
    for i in lost:
    
        # (학생 번호 - 1) 이 reserve에 있으면 reserve에서 (학생번호 - 1) 제거
        if (i-1) in reserve:
            reserve.remove(i-1)
        
        # (학생 번호 + 1) 이 reserve에 있으면 reserve에서 (학생번호 + 1) 제거
        elif (i+1) in reserve:
            reserve.remove(i+1)
        
        # 위에 두 조건 경우(if, elif)는 여별을 빌렸으므로 n에서 -1 하지 않아도되지만
        # else의 경우는 빌리지 못했으므로 n에서 -1을 해야한다
        else:
            n -= 1
    
    return n
출처: https://1ets-just-do-it.tistory.com/40 [파이썬은 신이야🔥🔥🔥:티스토리]

풀이 해석

  • set을 통해 겹치는 수를 찾은 후 리스트의 filter를 통해 겹치는 부분을 lost와 reserve에서 각각 제거한 후 for문을 이용하였다

배울 점

  • set 함수의 이용
  • filter와 lambda 함수를 이용한 정렬

댓글남기기