체육복을 도난당한 학생에게 여벌의 체육복을 갖고있는 학생이 빌려주는 문제이다.
n = 전체 학생
, reserve = 여벌의 체육복이 있는 학생
, lost = 체육복을 잃어버린 학생
문제에서 각각의 학생을 key - value
의 형태를 띄고있는 dictionary
가 아닌, 리스트로 주어졌다.
전체 학생의 수가 5이면 n = [1, 2, 3, 4, 5]
로 표현 가능하고 또, 체육복을 빌려줄때는 바로 앞번호의 학생이나 뒷번호의 학생에게만 빌려 줄 수 있다고 했다. 그래서 index
별로 값을 비교해서 나올수 있는 경우의 수를 분류했다.
여벌의 체육복을 빌려주는 경우의 수는 크게 2가지가 있다.
lost
가reserve
에 포함되지 않는 경우
reserve[i] == lost[j] + 1
이면 여벌의 체육복을 빌려 줄 수 있다.reserve[i] == lost[j] - 1
이면 여벌의 체육복을 빌려 줄 수 있다.
lost
에reserve
가 포함되는 경우
- 이때는 여벌 체육복을 가져온 학생이 체육복을 도난당했으므로, 다른 학생에게 체육복을 빌려 줄 수 없다. 따라서, reserve의 값은 사용할 수 없다.
마지막에는
1. 전체 학생에서 잃어버린 학생을 빼주고(rest
)
2. 여벌의 체육복을 빌려준 reserve
는 잃어버린 학생(lost
)의 값을 가지고 있으므로 (borrow
)
3. rest
와 borrow
의 합집합을 구하면 체육복을 가지고 있는 학생의 최댓값을 구할 수 있다.
코드는 다음과 같다.
def solution(n, lost, reserve):
n = [i for i in range(1, n+1)]
for i in range(len(reserve)):
for j in range(len(lost)):
if lost[j] in reserve: # 여벌의 체육복을 가져온 학생이 도난당한 경우
continue
elif reserve[i] == lost[j] + 1 or reserve[i] == lost[j] - 1: # 여벌의 체육복을 빌려 줄 수 있는 경우
reserve[i] = lost[j]
rest = set(n) - set(lost)
borrow = set(lost) & set(reserve)
return len(rest | result)