programmers.co.kr/learn/courses/30/lessons/42885
코딩테스트 연습 - 구명보트
무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다. 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 5
programmers.co.kr
[코테리뷰]
접근 방식
-
그리디 = > 구명보트에 2사람이 같이 탈 수 있는 조건 : 보다 무거운 사람은 보다 가벼운 사람과 탈 수 있다는 가정 성립
-
그래서 인덱스를 앞뒤로 좁혀나가서 같이 탈 기준(limit보다 무게가 같거나 적은지)으로 비교해줌.
-
비교 ok : 서로 인덱스 +1/-1
-
비교 not ok : 끝의 인덱스 -1
-
내 코드
- sort를 해주고, deque를 사용함
from collections import deque
def solution(people, limit):
alone, together=0,0 # 따로, 둘이 같이 타는 경우의 수 변수
queue = deque(sorted(people)) # 오름차순으로 정렬
lightest = queue.popleft() # 가벼운 사람
while lightest:
if not queue: # 큐가 (비교대상이) 더이상 존재하지 x
alone+=1
break
heaviest = queue.pop() # 무거운 사람
sum = lightest+heaviest # 비교할 대상 : 두 사람의 무게 합
if sum <= limit: # 같이 탈 조건 : limit보다 적을 때 같이 타기
together+=1
if not queue: # empty pop - 오류 방지
break
else:
lightest = queue.popleft()
else: # 무거운 사람 혼자 보트 타기
alone+=1
answer=alone+together
return answer
내코드의 문제점 :
- 큐를 이용하다보니 큐가 더이상 존재하지 않을 때 ( 비교대상이 없거나, 비교 자체가 끝났을 때의) 처리를 각각 해주어야지 제대로 된 답이 도출된다. (이 오류를 잡느라고 시간을 오래씀) & 직관적으로 코드를 볼 때 어려움! ㅜㅜ
다른 분 코드
- 내 코드보다 직관적으로 이해가능!
def solution(people, limit):
people.sort()
count = 0
first = 0
last = len(people) - 1
while first < last:
if people[first] + people[last] <= limit:
first += 1
last -= 1
count += 1
if first == last:
count += 1
return count
'CS > 코딩테스트' 카테고리의 다른 글
[코테리뷰] Heap - Lv2. 더 맵게 (0) | 2020.11.26 |
---|---|
[코테리뷰] DFS/BFS - Lv3. 네트워크 (0) | 2020.11.24 |
[코테리뷰] 스택/큐- Lv2. 프린터 (Deque, Stack 사용) (0) | 2020.11.17 |
[코테리뷰] Lv1. 문자열 내림차순으로 배치하기 (0) | 2020.11.14 |
[코테리뷰] 정렬 - Lv2. 가장 큰 수 (0) | 2020.11.12 |
WRITTEN BY
,