[PG] 체육복

nerry·2022년 1월 18일
0

알고리즘

목록 보기
12/86

체육복

첫 풀이 (과거..언젠가)

def solution(n, lost, reserve):
    answer = 0
    newReserve =[]
    for r in reserve:
        if r not in lost: # 잃어버린 학생이 아닐 때
            newReserve.append(r) 
        else : # 잃어버린 학생이면 수업을 들을 수 있음
            lost.remove(r)
    for l in lost: # 잃어버린 학생들 중에
        n-=1 # 전체 학생 중에서 잃어버린 수 만큼 빼기
        if newReserve.count(l+1)!=0 : # 잃어버린 애 뒷번호가 빌려줄 수 있다.
            answer+=1 # 수업 듣는 학생 추가
            newReserve.remove(l+1) # 빌려줬음
        elif newReserve.count(l-1)!=0: # 잃어버린 애 앞번호가 빌려줄 수 있다.
            answer+=1 # 수업 듣는 학생 추가
            newReserve.remove(l-1) # 빌려줬음
    return n+answer

리팩토링

def solution(n, lost, reserve):
    lost.sort()
    reserve.sort()
    for l in lost:
        n-=1
        if l in reserve: # 잃어버렸지만 여분이 있음
            n+=1
        # 이 아래 -> 잃어버렸고, 여분도 없음
        elif l-1 in reserve and l-1 not in lost:
        	# 잃어버린 번호 앞번호가 빌려줄 수 있다. 그치만 잃어버린 애가 아니어야 함
            n+=1
            reserve.remove(l-1) # 빌려줌
        elif l+1 in reserve and l+1 not in lost:
        	# 잃어버린 번호 뒷번호가 빌려줄 수 있다. 그치만 잃어버린 애가 아니어야 함
            n+=1
            reserve.remove(l+1) # 빌려줌
        
    return n

실패 log
일단.. 무슨 이유인지 모르겠다... 22.1.18..
sort()를 둘다 해주고 i-1부터 하니 모든 태케를 통과했다. 22.1.19

다른 풀이

def solution(n, lost, reserve):
    new_lost = set(lost) - set(reserve)
    new_reserve = set(reserve) - set(lost)
    for i in new_lost:
        if i - 1 in new_reserve:
            new_reserve.remove(i - 1)
            continue
        elif i + 1 in new_reserve:
            new_reserve.remove(i + 1)
        else:
            n-=1
    return n

가장 깔끔해보였다. set으로 만들면 알아서 sort되니 sort가 추가로 요하지도 않는다.
여기에 굳이 remove로 O(n)을 소비하지 않아도 되는 것을 알았다.

def solution(n, lost, reserve):
    new_lost = set(lost) - set(reserve)
    new_reserve = set(reserve) - set(lost)
    for i in new_lost:
        if i - 1 in new_reserve:
            new_reserve-={i - 1}
        elif i + 1 in new_reserve:
            new_reserve-={i+1}
        else:
            n-=1
    return n

set-={원소} 하면 사라진다. 집합끼리 빼는 거니깐 당연히 가능하다.

profile
터벅터벅 개발(은좋은)자 로그

0개의 댓글