문제를 정리해보자.
여벌의 체육복을 가지고 있는 학생은 체육복이 없는 학생에게 빌려줄 수 있다. 단, 양옆의 학생에게만 빌려줄 수 있다.
하지만 여벌의 체육복을 가지고 있는 학생이 체육복을 도난당했다면 빌려줄 수 없다. (자신이 사용해야 하기 때문이다.)
체육복이 있어야 체육수업을 들을 수 있다. 체육수업을 들을 수 있는 학생의 최댓값을 구해야 한다.
풀이를 생각해보자.
1) 도난당한 학생 => 체육복이 없다.
2) 도난당한 학생이며 여벌이 있는 학생 => 체육복이 있다. 빌려줄 체육복이 없다.
3) 여벌이 있는 학생 => 체육복이 있다. 빌려줄 체육복도 있다.
3번 학생만 1번 학생을 빌려주면 된다.
구현해보자.
# 전체 학생의 수 : n
# 도난당한 학생들의 번호가 담긴 배열 : lost
# 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 : reserve
def solution(n, lost, reserve):
dp = [1] * 32
new_reserve = []
count = n - len(lost)
# 도난 학생
for num in lost:
dp[num] = 0
for num in reserve:
# 여벌 학생 == 도난 학생
if dp[num] == 0:
dp[num] = 1
count += 1
# 여벌 학생 != 도난 학생
else:
new_reserve.append(num)
lost.sort()
new_reserve.sort()
# 체육복 빌려주기
for num in new_reserve:
for check in [num-1, num+1]:
if dp[check] == 0:
dp[check] = 1
count += 1
break
return count
print(solution(5, [2, 4], [3, 5]))
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스][Python] 타겟 넘버 (0) | 2022.01.11 |
---|---|
[프로그래머스][Python] 징검다리 (0) | 2022.01.05 |
[프로그래머스][Python] 섬 연결하기 (0) | 2021.12.29 |
[프로그래머스][Python] 큰 수 만들기 (0) | 2021.12.29 |
[프로그래머스][Python] 구명보트 (0) | 2021.12.28 |