코딩테스트/코딩테스트 문제
코딩테스트 준비 - 프로그래머스Lv2: 구명보트 풀이 (파이썬)
공부가싫다가도좋아
2021. 7. 7. 15:58
반응형
프로그래머스: 구명보트 풀이
문제풀러가기
https://programmers.co.kr/learn/courses/30/lessons/42885?language=python3#
코딩테스트 연습 - 구명보트
무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다. 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 5
programmers.co.kr
문제 분석
1. 보트에는 2명까지만 탈 수 있음.
2. 보트에는 무게 제한이 있음.
코드:실패(시간초과)
def solution(people, limit):
people.sort()
weight=0
cnt=0
while people:
weight=people.pop()
for i in range(len(people)):
if weight+people[i]<=limit:
people.pop(i)
break
weight=0
cnt+=1
return cnt
#시간초과
처음에 pop()을 썼더니, 효율성 검사에서 시간초과가 떠서 실패했다.
코드: 성공
def solution(people, limit):
people.sort()
cnt=0
left=0
right=len(people)-1
while left<=right:
if left==right:
cnt+=1
break
if people[left]+people[right]<=limit:
left+=1
right-=1
else:
right-=1
cnt+=1
return cnt
똑같은 원리로, pop을 빼고 코드를 짜주니 성공!!
코드 풀이
def solution(people, limit):
people.sort() #제일 작은 숫자와 큰 숫자를 먼저 조합해야하므로, 정렬을 한다.
cnt=0 #보트수 카운트
left=0 #왼쪽에서 오른쪽으로 인덱스 이동시키는 변수
right=len(people)-1 #오른쪽에서 왼쪽으로 인덱스 이동시키는 변수
while left<=right:
if left==right: #같은 인덱스를 가르킬때
cnt+=1
break
if people[left]+people[right]<=limit: #제일 작은숫자와 큰숫자를 조합했을때
left+=1
right-=1
else:
# 제일 작은숫자와 큰숫자를 조합해서 limit을 넘기면,
# 큰 숫자는 어떤 숫자와 조합해도 limit을 넘기므로 빼주면서 cnt+1을 해준다
right-=1
cnt+=1
return cnt
반응형