코드
def solution(n, lost, reserve):
# 정렬
lost.sort()
reserve.sort()
# lost, reserve에 공통으로 있는 요소 제거
for i in reserve[:]:
if i in lost:
reserve.remove(i)
lost.remove(i)
# 체육복 빌려주기(나의 앞 번호부터 확인)
for i in reserve:
if i-1 in lost:
lost.remove(i-1)
elif i+1 in lost:
lost.remove(i+1)
return n-len(lost)
가장 먼저, lost, reserve를 오름차순 정렬 해준다.
예를 들어, n = 5, lost = [2, 4], reserve = [3, 1] 일 때를 생각해 보자.
1번이 2번에게 체육복을 빌려주고, 3번이 4번에게 체육복을 빌려주면 모두가 체육수업을 들을 수 있을 것이다.
하지만, lost, reserve를 정렬하지 않고 체육복을 빌려준다고 하면 결과가 어떻게 될까? (n = 5, lost = [2, 4], reserve = [3, 1])
- i = 3이면
- i - 1 = 2, lost에 존재하므로 lost에서 2 제거
- lost = [4]
- i=1이면
- i - 1 = 0, lost에 존재하지 않음
- i + 1 = 2, lost에 존재하지 않음
- lost = [4]
정렬하지 않으면, n - len(lost) = 5 - 1 = 4명이 체육복을 입을 수 있다는 결과가 도출된다.
lost, reserve를 정렬하고 다시 과정을 진행해 보면 다음과 같다. (n = 5, lost = [2, 4], reserve = [1, 3])
- i=1이면
- i - 1 = 0, lost에 존재하지 않음
- i + 1 = 2, lost에 존재하므로 lost에서 2 제거
- lost = [4]
- i = 3이면
- i - 1 = 2, lost에 존재하지 않음
- i + 1 = 4, lost에 존재하므로 lost에서 4 제거
- lost = [ ]
정렬하면, n - len(lost) = 5 - 0 = 5명이 체육복을 입을 수 있다는 결과가 도출된다.
따라서, 체육복을 빌려주는 과정을 진행하기 전에 lost와 reserve를 정렬하는 과정이 필요하다.
lost와 reserve를 정렬한 뒤에는 두 배열에 공통으로 존재하는 요소를 각 배열에서 제거한다.
문제에서 '여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.'라고 명시하였기 때문이다.
여기까지의 과정을 모두 마무리했으면 lost, reserve 배열의 요소들을 비교하여 체육복을 빌려주는 작업을 진행한다.
나는 reserve를 기준으로 for문을 작성하였다.
만약, 1번 학생(= i-1)이 체육복이 없으면 1번 학생은 0번은 없으므로 2번 학생(= i)에게만 체육복을 받을 수 있다.
그러므로 reserve의 요소 i를 기준으로 왼쪽인 i-1부터 lost에 존재하는지 확인하고, i-1이 없으면 i+1을 확인하도록 하였다.
i-1 또는 i+1이 lost에 존재하면 lost에서 해당 값을 제거함으로써 체육복을 빌려준 것으로 한다.
이때 둘 다 if문으로 작성하면 3번 학생이 2번 4번 모두에게 빌려주는 사태가 발생하게 된다.
한 명에게만 빌려줄 수 있으므로 if - elif로 작성하여 하나의 조건에 대해서만 작업을 진행할 수 있도록 해야 한다.
최종적으로 n명의 학생에서 체육복을 입지 못한(=잃어버린) 학생 수를 빼면 체육 수업을 들을 수 있는 학생 수를 구할 수 있다.