[프로그래머스] Lv.2 구명보트 (Python)

seulzzang·2022년 9월 29일
0

코딩테스트 연습

목록 보기
22/44
post-thumbnail

📍문제

[프로그래머스] Lv.2 구명보트

📍풀이

  • people을 오름차순으로 정렬한 리스트를 p라는 이름으로 큐로 선언해준다.
  • 제일 가벼운사람 + 제일 무거운사람 > limit이면 어차피 제일 무거운사람은 보트를 혼자밖에 못타므로 보트의 개수를 +1해주고, 제일 무거운사람을 pop한다.
  • 그게 아니라면 제일 가벼운사람과 제일 무거운사람을 보트 1개에 보낸다. popleftpop을 써서 제일 가벼운 사람과 제일 무거운 사람을 큐에서 빼준다.
  • 위의 과정들을 p가 빌 때 까지 반복한다.
  • while문 탈출조건을 체크해보자!!

💻첫번째 코드 (IndexError: pop from an empty deque)

from collections import deque

def solution(people, limit):
    answer = 0
    people.sort()
    p = deque(people)
    while p:
        if p[0] + p[-1] > limit: 
            p.pop() 
            answer += 1 
        else:
            p.popleft()
            p.pop()
            answer += 1
    return answer

단순하게 생각해서 짰는데 이러면 인덱스 에러가 뜨더라..
아마 인원수가 홀수일 경우 혼자 남는 사람이 생겨서 else문에서 popleft를 한 순간 빈 큐가 되어버려서 에러가 생기는 것 같았다. 그래서 조건문을 달아주기로 했다.

💻두번째 코드 (다수의 테스트케이스에서 런타임에러)

from collections import deque

def solution(people, limit):
    answer = 0
    people.sort()
    p = deque(people)
    while p:
        if p[0] + p[-1] > limit: 
            p.pop() 
            answer += 1 
        else: 
            if len(p) %2 == 0: # 짝수로 남아있으면
                p.popleft() 
                p.pop() # 둘이 같이 태워 보냄
                answer += 1 # 보트+1
            elif len(p) == 1: # 하나 남아있으면
                p.pop()
                answer += 1
    return answer

걍 딱봐도 조건문 잘못넣어준 코드ㅋㅋ
테스트케이스에서 통과해서 코드를 돌리니까 런타임에러와 시간초과..
else문에서 짝수로 남아있으면.. 이라는 조건이 애초에 틀렸다!😂

💻세번째 코드 (통과!)

from collections import deque

def solution(people, limit):
    answer = 0
    people.sort()
    p = deque(people)
    while p:
        if len(p) == 1: # 혼자 남으면
            p.pop()
            answer += 1
            break
        if p[0] + p[-1] > limit: 
            p.pop() 
            answer += 1 
        else:
            p.popleft()
            p.pop()
            answer += 1
    return answer

첫번째 코드에서 while문 안에서 맨 위에 break문만 달아준 것이다.
혼자 남는 경우(len(p) == 1) 보트를 태워 보내고 (answer += 1) while문을 탈출하도록 break를 달아줬다.
while문을 쓸 때 마다 탈출조건을 제대로 안걸어줘서 늘 에러가 났는데.. 이번에도 똑같은 실수를 범했다.

📍다른사람 풀이

def solution(people, limit) :
    answer = 0
    people.sort()

    a = 0
    b = len(people) - 1
    while a < b :
        if people[b] + people[a] <= limit :
            a += 1
            answer += 1
        b -= 1
    return len(people) - answer

맨 앞의 인덱스번호와 맨 뒤의 인덱스 번호를 a, b로 선언해주고 두 인덱스번호가 같아질 때 까지 가장 가벼운사람과 가장 무거운사람을 보트에 태워 보낸다.
짝 지었을 때만 2명씩 나가니까 전체 인원에서 짝지은 수만 빼주면 보트의 수가 나온다..!
어차피 문제는 보트의 수를 구하는 것이니까 나처럼 구구절절한 조건문이 필요 없었을지도..

profile
중요한 것은 꺾이지 않는 마음

0개의 댓글