점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
n | lost | reserve | result |
---|---|---|---|
5 | [2, 4] | [1, 3, 5] | 5 |
5 | [2, 4] | [3] | 4 |
3 | [3] | [1] | 2 |
def solution(n, lost, reserve):
losts = set(lost) - set(reserve)
reserves = set(reserve) - set(lost)
n -= len(losts)
for reserve_num in reserves:
for lost_num in losts:
if abs(lost_num - reserve_num) == 1:
n += 1
losts.remove(lost_num)
break
return n
여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있다는 문구가 있습니다. 이 경우, 여벌 체육복을 해당 학생이 입기 때문에 해당 학생은 다른 학생에게 체육복을 빌려줄 수 없습니다.
즉, lost
(체육복을 잃어버린 학생의 배열)와 reserve
(여벌 체육복을 가지고 있는 학생의 배열)에 중복된 값이 있다면 그 값을 제거해야 합니다.
이후, 체육복을 잃어버린 학생의 수만큼 n을 감소시킵니다.
우선 여벌 체육복을 가지고 있는 학생 한 명의 번호를 가져옵니다. 해당 번호를 가지고 losts
를 순회합니다.
만약, (체육복을 잃어버린 학생 번호) - (여벌 체육복을 가진 학생 번호)
의 절댓값이 1이라면 여벌 체육복을 빌려줄 수 있으므로, n을 증가시키고 losts
에서 체육복을 잃어버린 학생의 번호를 제거합니다.
이후에는 해당 번호의 학생도 여벌 체육복이 없기 때문에 반복문을 break
로 중단합니다.
def solution(n, lost, reserve):
_reserve = [r for r in reserve if r not in lost]
_lost = [l for l in lost if l not in reserve]
for r in _reserve:
f = r - 1
b = r + 1
if f in _lost:
_lost.remove(f)
elif b in _lost:
_lost.remove(b)
return n - len(_lost)
일단 _reserve
와 _lost
를 반복문과 in
을 사용하여 만들었다. 이후, 자신의 번호의 앞이 있거나 뒤가 있을 경우, 해당 번호를 찾아 제거한다.
이렇게 여벌 체육복을 다 빌려주고 남은 _lost
의 길이는 결국 체육 수업을 듣지 못하는 사람이므로 n에서 빼서 반환한다.