[파이썬/python] 프로그래머스 : 체육복 (Lv.1)

def solution(n, lost, reserve):
    lost_cnt = 0
    
    lost_set = set(lost)
    reserve_set = set(reserve)

    lost = list(lost_set - (lost_set & reserve_set))
    reserve = list(reserve_set - (lost_set & reserve_set))
    
    for i in lost:
        if i-1 in reserve:
            lost_cnt += 1
            del reserve[reserve.index(i-1)]
            
        elif i+1 in reserve:
            lost_cnt += 1
            del reserve[reserve.index(i+1)]

    return n - (len(lost) - lost_cnt)

내 코드의 문제점:

1. set을 한 다음에 굳이 list로 변환시켜준 것이 불필요한 과정이다

2. lost와 reserve의 차집합을 구해서 빼주는 과정에서 불필요한 중복이 많다.

둘을 set한 것을 따로 만들어 변수를 만들기 보다

s = set(lost) & set(reserve) 이런 식으로 둘의 차집합을 따로 변수로 저장하고,

set_lost = set(lost) - s

set_reserve = set(reserve) - s 이렇게 하는 게 중복이 적어지고 더 깔끔하다.

3. 따로 체육복을 빌린 학생을 카운트하는 과정이 불필요하다. 이 과정을 없애고, for문을 lost기준이 아닌 reserve기준으로 돌려주고

l의 원소를 제거하는 식으로 가면 n - len(l)을 하면 답이 나온다.

 

 

고친 답:

def solution(n, lost, reserve):
    
    s = set(lost) & set(reserve)
    lost_set = set(lost) - s
    reserve_set = set(reserve) - s
    
    for i in reserve_set:
        if i-1 in lost_set:
            lost_set.remove(i-1)
            
        elif i+1 in lost_set:
            lost_set.remove(i+1)

    return n - len(lost_set)

 

comment