def solution(n, lost, reserve):
# 2 <= n <= 30
# 1 <= len(lost) <= n, 중복 X
# 1 <= len(reserve) <= n, 중복 X
# 여벌 체육복이 있는 학생만 다른 학생에게 빌려줄 수 있음
# 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있음
status = [1]*(n+1)
for r in reserve:
status[r] += 1
for l in lost:
status[l] -= 1
for i in range(n+1):
if status[i] == 2:
if i-1 >= 0 and status[i-1] == 0:
status[i] -= 1
status[i-1] += 1
elif i+1 < n+1 and status[i+1] == 0:
status[i] -= 1
status[i+1] += 1
status = status[1:]
return sum([1 for x in status if x != 0 ])
이번 문제는 여벌 체육복을 가진 학생들이 다른 학생들에게 양옆으로만 빌려줄수 있다는 가정하에, 도난당한 학생들에게 체육복을 빌려줘서 체육수업을 들을 수 있는 학생의 최댓값을 구하는 문제이다.
문제의 조건을 최대한 꼼꼼히 읽고 주석에 남겨놓으면서 히든 케이스나 예외를 방지하려고 노력하였던 문제이다 :)
'Algorithm 💡 > Greedy' 카테고리의 다른 글
[백준 1049번] 기타줄 (1) | 2023.10.07 |
---|---|
[백준 23889번] 돌 굴러가유 (0) | 2023.09.30 |
[백준 17392번] 우울한 방학 (0) | 2023.09.29 |
[백준 13305번] 주유소 (0) | 2023.02.24 |
[백준 3109번] 빵집 (0) | 2023.02.09 |