people
을 오름차순으로 정렬한 리스트를 p
라는 이름으로 큐로 선언해준다. 제일 가벼운사람 + 제일 무거운사람 > limit
이면 어차피 제일 무거운사람은 보트를 혼자밖에 못타므로 보트의 개수를 +1해주고, 제일 무거운사람을 pop
한다.popleft
와 pop
을 써서 제일 가벼운 사람과 제일 무거운 사람을 큐에서 빼준다.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명씩 나가니까 전체 인원에서 짝지은 수만 빼주면 보트의 수가 나온다..!
어차피 문제는 보트의 수를 구하는 것이니까 나처럼 구구절절한 조건문이 필요 없었을지도..