문제.
...더보기
체육복을 도난 당한 사람에게 여벌의 체육복이 있는 사람들이 체육복을 빌려주어, 최대한 많은 사람이 체육복을 입을 수 있도록 하자. 다만, 체육복은 자기 바로 앞, 뒤 번호의 사람에게만 빌릴 수 있다.
제한조건.
1. 사람들은 번호로 주어진다.
2. 학생의 수는 2명 이상 30명 이하이다.
3. 중복되는 번호는 없으며, 도난당한 수 / 여벌을 가져온 수 모두 1명 이상 n명 이하이다.
4. 여벌을 가져온 학생이 도난을 당했을 수도 있다.
풀이.
def solution(n, lost, reserve):
lost_ = []
reserve_ = []
for i in lost:
if not i in reserve:
lost_.append(i)
for i in reserve:
if not i in lost:
reserve_.append(i)
non_people = len(lost_)
for i in lost_:
if (i-1) in reserve_:
non_people -= 1
reserve_.remove(i-1)
elif (i+1) in reserve_:
non_people -= 1
reserve_.remove(i+1)
answer = n - non_people
return answer
Step 1.
문제의 제한조건인 여벌 체육복을 가져온 사람 중 도난을 당한 케이스를 먼저 처리해줘야 합니다. 즉 reserve와 lost에 중복으로 담겨있는 값을 제거해줍니다.
Step 2.
분실한 사람(lost에 있는 요소)을 하나씩 뽑은 뒤, 앞 뒤 값들이 여벌이 있는 사람(reserve에 있는 요소)에 담겨있는지 비교합니다. 만약 있을 경우, 분실한 사람의 수를 하나씩 줄여나갑니다.
lost 와 reserve 를 비교하여 중복된 값을 제거해준 새로운 리스트를 만드는 코드의 경우, 리스트 문법을 사용하면 더 간단하게 구현할 수 있습니다.
lost_ = [l for l in lost if not l in reserve]
reserve_ = [r for r in reserve if not r in lost]
'Algorithm > Problems' 카테고리의 다른 글
[Programmers] 영어 끝말잇기 (0) | 2019.10.02 |
---|---|
[Programmers] Level 1(part. 2) (0) | 2019.09.28 |
[Programmers] Level 1(part. 1) (0) | 2019.09.24 |
[백준] 11047번 - 동전 0 (0) | 2019.09.17 |
[백준] 11399번 - ATM (0) | 2019.09.16 |