date posted: 2020-04-04
문제설명 --> 체육복
이문제는 Greedy 문제중 하나입니다. Greedy 문제란 보통 문제들을 분할해서 하나하나 풀어 나가는데 분할된 문제에서 가장 optimal 한 방향으로 문제를 풀어나가는겁니다. Global 한 결과는 생각은 안한체 local 한 결과만 신경쓰고 바로 진행을 하기 때문에 Greedy 문제라고 합니다.
이번 문제는 레벨1 이라 상당히 쉬웠는데요.
def solution(n, lost, reserve): _reserve = [r for r in reserve if r not in lost] _lost = [l for l in lost if l not in reserve] for r in _reserve: f = r - 1 b = r + 1 if f in _lost: _lost.remove(f) elif b in _lost: _lost.remove(b) return n - len(_lost)
일단 Time complexity 는 모든 학생이 여별의 체육복이 있지만 모두 잃어버렸다면 _reserve, _lost 만들때 각자 O(n) 이 걸릴테고 밑에 _reserve 를 for loop 에 돌릴때 O(n) 이 발생해서 => 3O(n) 이 됩니다.
둘다 Linear 이긴 하지만 3O(n) 는 3배나 깊은 slope 를가지고 있습니다 => n 이 하나 늘대마다 3배 오래 걸립니다.
최대한 줄여봅시다.
아래의 코드에선 자꾸 2개가 틀린다는데 도대체 무엇때문에 에러가 나는지 모르겠네요 된다면 O(n) 이 될텐데요.
def solution(n, lost, reserve): for r in reserve: if r in lost: lost.remove(r) continue f = r - 1 b = r + 1 if f in lost: lost.remove(f) elif b in lost: lost.remove(b) return n - len(lost)