문제풀이/Programmers

[프로그래머스][Lv1][Python] 체육복

서채리 2022. 2. 10. 16:53

[문제]

https://programmers.co.kr/learn/courses/30/lessons/42862

 

코딩테스트 연습 - 체육복

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번

programmers.co.kr

 

[풀이]

이 문제의 핵심은 제한사항의

여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.

부분이라고 생각한다.

 

한 학생이 lost와 reserve 리스트 둘 다에 포함된다면 그 학생은 두 리스트에서 빼주어야 한다. 집합으로 생각하면 쉬운데, 교집합을 제외한 집합을 구하면 된다. 

 

두 리스트 모두 교집합을 제외한 값으로 갱신해 준 후, lost 리스트 원소를 차례대로 돌려 해당 원소의 -1 값이 reserve 리스트에 있다면 해당 값을 reserve 리스트에서 삭제한다. -1 값이 reserve 리스트에 없을 경우 +1 값이 reserve에 있는지 확인 후 있다면 reserve 리스트에서 삭제하고, +1 값도 없을 경우에는 체육복을 빌릴 수 없는 경우이기 때문에 전체 학생 수 n에서 1을 빼준다.


[코드]

def solution(n, lost, reserve):
    _lost = list(set(lost).difference(reserve))
    _reserve = list(set(reserve).difference(lost))
    for i in _lost:
        if (i - 1 in _reserve):
            _reserve.remove(i-1)
        elif (i + 1 in _reserve):
            _reserve.remove(i+1)
        else:
            n -= 1
    return n