bit가 눈 앞에서 왔다갔다

Py) 프로그래머스 42885 구명보트 본문

Algorithm/Prob

Py) 프로그래머스 42885 구명보트

헬린인형 2022. 2. 7. 23:32

https://programmers.co.kr/learn/courses/30/lessons/42885

 

코딩테스트 연습 - 구명보트

무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다. 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 5

programmers.co.kr

 

내가 짜는 코드는 효율성 테스트를 한 번에 통과하는 경우가 거의 없다-

그래도 정확성 테스트를 통과함에 큰 의의를 둔다.

 

* 최적화 전

딱 봐도 효율성 통과 못하게 생기긴 함ㅇㅇ 너무 막 짰다.

def solution(people, limit):
    answer = 0
    people=sorted(people, reverse=True)

    while len(people):
        comp = len(people) - 1
        while comp >= 0:
            if len(people) == 1:
                del people[0]
                answer += 1
                break
            if people[0]+people[comp] > limit:
                if comp == len(people) - 1:
                    answer += 1
                    del people[0]
                    break
                del people[comp+1]
                del people[0]
                answer += 1
                break
            else:       # 합이 limit와 크거나 같을 때
                del people[comp]
                del people[0]
                answer += 1
                comp -= 1
                break


    return answer

이중 반복문 없앴는데 또 시간 초과 뜸

def solution(people, limit):
    answer = 0
    people=sorted(people, reverse=True)

    comp = len(people) - 1
    while comp >= 0:
        if len(people) == 1:
            del people[0]
            answer += 1
            break
        if people[0]+people[comp] > limit:
            if comp != len(people) - 1:
                del people[comp+1]
        else:       # 합이 limit와 크거나 같을 때
            del people[comp]
            comp -= 1

        del people[0]
        answer+= 1
        comp -= 1

    return answer

뭐가 그렇게 잡아먹는걸까 싶어서 시간 복잡도를 찾아봤다

deque를 쓰면 뭐가 달라질까 싶었는데 deque 양끝 접근 시 O(1), 중간 접근 시 O(n)

del은 양끝, 중간 상관없이 O(n)인듯했고, pop도 생각해봤으나 맨 뒤 접근시에만 O(1)이었다.

list를 deque로 바꿔볼까 싶었다.

 

*최종

from collections import deque
def solution(people, limit):
    deq = deque(sorted(people, reverse=True))
    answer = 0

    comp = len(deq) - 1
    while comp >= 0:
        if len(deq) == 1:
            deq.popleft()       # 인덱스 0 지움
            answer += 1
            break
        if deq[0]+deq[comp] > limit:
            if comp != len(deq) - 1:
                deq.remove(comp+1)

        else:       # 합이 limit와 크거나 같을 때
            deq.pop()
            comp -= 1

        deq.popleft()
        answer+= 1
        comp -= 1

    return answer

사랑해요 deque

사랑해요 시간복잡도 정리해놓으신 분들

이제 이런거 나오면 deque만 쓴다ㅠ

시간 복잡도의 중요성을 느끼게 된 날,,,

 

반응형

'Algorithm > Prob' 카테고리의 다른 글

Py) 프로그래머스 43236 징검다리  (0) 2022.02.10
Py) 프로그래머스 42579  (0) 2022.02.09
Py) 프로그래머스 43163 단어 변환  (0) 2022.02.04
Py) 프로그래머스 42842 카펫  (0) 2022.02.03
Py) 프로그래머스 42746  (0) 2022.01.28
Comments