나의 풀이
def solution(n, lost, reserve):
lost.sort()
reserve.sort()
for i in lost[:] :
if i in reserve :
reserve.remove(i)
lost.remove(i)
for i in lost[:] :
if i-1 in reserve :
reserve.remove(i-1)
lost.remove(i)
elif i+1 in reserve :
reserve.remove(i+1)
lost.remove(i)
return n - len(lost)
- 먼저 lost, reserve 리스트를 오름차순으로 정렬한다.
- 만약 reserve 에 있는 학생이 lost 에도 있다면, 해당 학생을 두개의 리스트에서 각각 제거한다.
- 만약 lost 에 있는 학생 번호보다 1 작은 번호가 reserve 에 있다면, 체육복을 우선으로 빌린다.
- (중복된 번호가 없으므로, 나보다 앞에 있는 학생은 내 뒤에 있는 학생들에게 빌려줄 수 없음)
- 그런 다음, 1 앞에 있는 번호가 없다면 1뒤에 있는 번호가 있는지 확인하고, 그 학생에게 체육복을 빌린다.
다른 풀이
def solution(n, lost, reserve):
answer = 0
reserve_del = set(reserve)-set(lost)
lost_del = set(lost)-set(reserve)
for i in reserve_del:
if i-1 in lost_del:
lost_del.remove(i-1)
elif i+1 in lost_del:
lost_del.remove(i+1)
answer = n - len(lost_del)
return answer
- sort 를 이용하지 않아도 되는 풀이이다.
- set(집합) 을 이용해 여벌이 있지만, 잃어버린 학생 번호를 모두 지운다.
- 그런다음, 여벌이 있는 학생 번호를 돌면서
- 먼저 내 앞에 있는 학생에게 빌려주고, 앞에 있는 학생이 없다면 내 뒤 학생에게 빌려주도록 한다.
- # 잃어버린 학생 : 4 2
# 여벌이 있는 학생 : 3 6 5 을 예시로 들자. - 만약 3번 학생이 내 뒤에 있는 4번에게 먼저 빌려준다면, 2번 학생은 빌릴 곳이 없게 된다.
- 따라서 항상 앞에 있는 학생에게 우선적으로 빌려주어야 한다.
'알고리즘 > 그리디' 카테고리의 다른 글
[프로그래머스] 큰 수 만들기 - 파이썬(pytyon) (0) | 2022.09.16 |
---|---|
[프로그래머스] 조이스틱 (0) | 2022.09.16 |
[Python] 백준 1783: 병든 나이트 (0) | 2021.09.23 |
[Python] 백준 10610: 30 (0) | 2021.09.14 |
[Python] 백준 2875: 대회 or 인턴 (0) | 2021.09.08 |
댓글