[Greedy] 체육복

개발새발log·2021년 10월 5일
0

Programmers

목록 보기
5/35


📌 제한 사항이 중요한 문제였다. 이걸 놓치면 코드를 깨작깨작 고쳐봐도 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번 조건 역시 충족시켰다

profile
⚠️ 주인장의 머릿속을 닮아 두서 없음 주의 ⚠️

0개의 댓글