📌 제한 사항이 중요한 문제였다. 이걸 놓치면 코드를 깨작깨작 고쳐봐도 4-50점의 행방 날라감🕊
메인 로직 자체는 간단하다. reserve 리스트를 순회하면서 해당 요소의 -1/+1에 해당하는 값이 lost 리스트에 존재하는지 체크하고 해당 요소를 제거하면 된다. 그리고 전체 길이에서 lost 리스트의 최종개수를 반환하면 완료!
다만, 이 전에 제한 사항을 고려하여 리스트를 정제할 필요가 있다
1. 중복 제거하기
2. lost와 reserve 간 중복 제거하기
1번은 대놓고 명시되어 있다. 2번은 마지막 제한사항으로부터 끌어낼 수 있다. 여벌 체육복을 가져온 학생이 도난당했다는 것은 결국 해당 학생이 체육복을 빌려줄 수 없다는 것이므로 아예 이 판에서 배제하는 게 합당하다.
def solution(n, lost, reserve):
_reserve = set(reserve)-set(lost)
_lost = set(lost)-set(reserve)
for r in _reserve:
if r-1 in _lost:
_lost.remove(r-1)
elif r+1 in _lost:
_lost.remove(r+1)
return n-len(_lost)
👉 set을 활용하여 1번 조건을 충족하고, 두 set 간 차집합 연산을 함으로써 2번 조건 역시 충족시켰다