[프로그래머스] 체육복

YEAh·2021년 4월 10일
0
post-thumbnail

🔗 문제 링크

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

💻 코드

def solution(n, lost, reserve):
    answer = 0
    data = [1] * (n + 2)

    for i in lost:
        if i in reserve:
            reserve.remove(i)
        else:
            data[i] = 0
    
    reserve.sort()
    
    for i in reserve:
        if data[i - 1] == 0:
            data[i - 1] = 1
        elif data[i + 1] == 0:
            data[i + 1] = 1

    answer = n - data.count(0)
    return answer

설계

data 리스트의 범위가 n + 2인 이유는 1번부터 n번까지 학생들의 바로 앞번호, 바로 뒷번호를 1번과, n번 학생도 예외를 두지않고 확인하기 위함이다. 체육복이 있는 경우를 1로 두고 도난 당한 학생은 0으로 두었다. 도난을 당했지만 여벌의 체육복이 있는 학생은 체육복을 다른 학생에게 빌려줄 수 없고 자신이 입기 때문에 reverse 리스트에서 그 학생의 번호를 삭제하고 그대로 1로 두었다.

여벌의 옷이 있는 학생은 자신의 앞번호의 학생부터 도난당했는지 확인하고 도난당하지 않았으면 뒷번호 학생을 확인한다.
입력이 n=6, lost=[4, 6], reserve = [5, 3] 인 경우, reserve를 정렬하지 않으면 5번 학생이 4번 학생에게 옷을 빌려주게 되어 6번 학생이 수업을 듣지 못하게 된다. 이러한 경우때문에 reserve를 정렬하여 여벌의 옷을 가진 학생 중에 번호가 작은 학생부터 앞번호, 뒷번호를 확인해야 한다.

📝 정리

파이썬 리스트 삭제 함수

  • remove() : 지정한 값 삭제
  • del() : 해당위치의 항목 삭제
profile
End up being.

0개의 댓글