코딩 테스트/프로그래머스

Lv2. 구명보트

  • -
728x90
반응형

문제 보기 :  구명보트

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


문제

  • 정답률 : 70%


작성 코드

from collections import deque
def solution(people, limit):
    
    people = deque(sorted(people))
    answer = 0
    s = 0 ; e = -1
    
    while len(people) > 1:
        if people[s] + people[e] > limit:
            people.pop()
        else:
            people.popleft()
            people.pop()
        answer += 1
        
    if people:
        return answer + 1
    else:
        return answer

풀이

큐를 이용해서 풀이했다. 처음에는 인원 수에 상관없이 limit에 가까이 가도록 사람들을 묶어야하는 것으로 이해했다.
근데 무조건 최대 2명씩만 묶을 수 있고, limit을 넘기면 안되는 것이었다.

리스트 + heapq로 풀려고 했는데, 뒤이어 작성하는 while문 속에서 remove를 사용할 수 밖에 없는데, 그럼 시간복잡도가 O(N²)가 되어 효율성 테스트에서 시간초과가 발생했다.

그래서 찾아낸 방법은 deque였다.
여러번 시행착오 끝에 규칙을 찾았는데 항상 최댓값과 최솟값을 더해 limit과의 대소관계를 비교한다는 것이다.
최댓값, 최솟값은 deque에 입력하기 전 리스트 정렬, 맨 앞 맨 뒤 원소로 찾았다.
최댓값+최솟값 > limit이면 최댓값만 pop으로 제거한다. 아니라면 최대, 최소 모두 pop, popleft로 제거한다.

while문이 끝난 뒤 people에 원소가 남아있다면 answer + 1을 답으로 출력하고, 없다면 answer을 답으로 출력한다.

320x100
728x90

'코딩 테스트 > 프로그래머스' 카테고리의 다른 글

Lv1. 완주하지 못한 선수  (0) 2024.09.13
Lv1. 대충 만든 자판  (0) 2024.09.13
Lv2. 택배상자  (1) 2024.09.10
Lv1. 문자열 나누기  (0) 2024.09.09
Lv2. 주차 요금 계산  (0) 2024.09.09
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.