

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)
| [파이썬/python] 백준 13909번 : 창문 닫기(🥈5) (0) | 2023.04.18 |
|---|---|
| [파이썬/python] 프로그래머스 : N개의 최소공배수 (Lv.2) (0) | 2023.04.07 |
| [파이썬/python] 프로그래머스 : 완주하지 못한 선수 (Lv.1) (0) | 2023.04.06 |
| [파이썬/python] 백준 7785번 : 회사에 있는 사람(🥈5) (0) | 2023.04.03 |
| [파이썬/python] 백준 2903번 : 중앙 이동 알고리즘(🥉3) (0) | 2023.04.03 |