
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
| n | lost | reserve | return |
|---|---|---|---|
| 5 | [2, 4] | [1, 3, 5] | 5 |
| 5 | [2, 4] | [3] | 4 |
| 3 | [3] | [1] | 2 |
1번 학생이 2번 학생에게 체육복을 빌려주고, 3번 학생이나 5번 학생이 4번 학생에게 체육복을 빌려주면 학생 5명이 체육수업을 들을 수 있습니다.
3번 학생이 2번 학생이나 4번 학생에게 체육복을 빌려주면 학생 4명이 체육수업을 들을 수 있습니다.
def solution(n, lost, reserve):
answer = 0
count = n - len(lost) # 전체 - 도난당한 학생의 수
for i in range(len(reserve)):
if reserve[i] in lost: # 여벌 체육복 학생이 체육복을 도난당했다면 count는 일정하다.
lost.remove(reserve[i]) # lost에서 삭제
elif (reserve[i] - 1) in lost: # reserve[i] - 1 학생이 도난당한 학생이라면
count = count + 1 # 빌려줘서 count 증가
lost.remove(reserve[i] - 1) # reserve[i] - 1 학생 lost에서 삭제
elif (reserve[i] + 1) in lost: # reserve[i] + 1 학생이 도난당한 학생이라면
count = count + 1 # 빌려줘서 count 증가
lost.remove(reserve[i] + 1) # reserve[i] + 1 학생 lost에서 삭제
answer = count
return answer
처음에 이렇게 풀었다가

,,,,,
그다음엔 여벌 체육복 학생이 체육복 도난 당한 경우에서 count 수 증가와 lost에서 제거해주는 코드를 추가해주었다.
def solution(n, lost, reserve):
answer = 0
count = n - len(lost) # 전체 - 도난당한 학생의 수
for i in range(len(reserve)):
if reserve[i] in lost: # 여벌 체육복 학생이 체육복을 도난당했다면
count += 1 # 도난당한 학생의 수가 줄었으므로 count 도 증가시켜준다.
lost.remove(reserve[i]) # lost에서 삭제
elif (reserve[i] - 1) in lost: # reserve[i] - 1 학생이 도난당한 학생이라면
count += 1 # 빌려줘서 count 증가
lost.remove(reserve[i] - 1) # reserve[i] - 1 학생 lost에서 삭제
elif (reserve[i] + 1) in lost: # reserve[i] + 1 학생이 도난당한 학생이라면
count += 1 # 빌려줘서 count 증가
lost.remove(reserve[i] + 1) # reserve[i] + 1 학생 lost에서 삭제
answer = count
return answer
그래도

조금 더 나아질 뿐 테케를 무사히 통과하지 못했다,,,,
정렬을 추가해보았다.
앞쪽부터 정렬해야 차례대로 앞쪽부터 빌릴 수 있으니!!!
def solution(n, lost, reserve):
answer = 0
# 정렬
lost.sort()
reserve.sort()
count = n - len(lost) # 전체 - 도난당한 학생의 수
for i in range(len(reserve)):
if reserve[i] in lost: # 여벌 체육복 학생이 체육복을 도난당했다면
count += 1 # 도난당한 학생의 수가 줄었으므로 count 도 증가시켜준다.
lost.remove(reserve[i]) # lost에서 삭제
elif (reserve[i] - 1) in lost: # reserve[i] - 1 학생이 도난당한 학생이라면
count += 1 # 빌려줘서 count 증가
lost.remove(reserve[i] - 1) # reserve[i] - 1 학생 lost에서 삭제
elif (reserve[i] + 1) in lost: # reserve[i] + 1 학생이 도난당한 학생이라면
count += 1 # 빌려줘서 count 증가
lost.remove(reserve[i] + 1) # reserve[i] + 1 학생 lost에서 삭제
answer = count
return answer

아우아엉아ㅜ아우ㅏㅇ우
테케 두 개 남았다 ............................
💡 여벌 체육복 학생이 체육복을 도난당했다면 <= 이 경우를
reserve에서 없애줘야 한다.
reserve가 중복될 수 있기 때문에 !!!
⭐️ reserve 리스트를 수정(삭제)하면서 순회하려면 원본 리스트 대신에 복사본(reserve[:])을 사용해야 한다고 한다.
def solution(n, lost, reserve):
answer = 0
count = n - len(lost) # 전체 - 도난당한 학생의 수
# 정렬
lost.sort()
reserve.sort()
# lost와 reserve에 둘 다 있는 학생 (여벌 체육복 학생이 체육복을 도난당한 경우)
for i in reserve[:]: # reserve 리스트를 수정(삭제)하면서 순회하려면 원본 리스트 대신에 복사본(reserve[:])을 사용해야 한다.
if i in lost: # 여벌 체육복 학생이 체육복을 도난당했다면
count += 1 # 도난당한 학생의 수가 줄었으므로 count 도 증가시켜준다.
lost.remove(i) # lost에서 삭제
reserve.remove(i) # reserve에서 삭제해야 중복 X
for i in reserve:
if (i - 1) in lost: # reserve[i] - 1 학생이 도난당한 학생이라면
count += 1 # 빌려줘서 count 증가
lost.remove(i - 1) # reserve[i] - 1 학생 lost에서 삭제
elif (i + 1) in lost: # reserve[i] + 1 학생이 도난당한 학생이라면
count += 1 # 빌려줘서 count 증가
lost.remove(i + 1) # reserve[i] + 1 학생 lost에서 삭제
answer = count
return answer