반응형
문제설명
타이타닉 유람선이 침몰하고 있다. 유람선에는 N명의 승객이 타고 있다. 구명보트를 타고 탈출해야 하는데 타이타닉에 있는 구명보트는 2명 이하로만 탈 수 있으며, 보트 한 개에 탈 수 있는 총 무게도 M kg 이하로 제한되어 있다. N명의 승객 몸무게가 주어졌을 때 승객 모두가 탈출하기 위한 구명보트의 최소개수를 출력하는 프로그램을 작성해라.
입력조건
- 첫째 줄에 자연수 N(5 <= N <= 1,000)과 M(70 <= M <= 250)이 주어진다.
- 둘째 줄에 N개로 구성된 몸무게 수열이 주어진다. 몸무게는 50이상 150이하이다.
- 각 승객의 몸무게는 M을 넘지 않는다. 즉, 탈출을 못하는 경우는 없다.
출력조건
- 첫째 줄에 구명보트의 최소 개수를 출력한다.
사고과정
- 구명보트에 가장 적은 몸무게와 가장 큰 몸무게의 사람을 최대한 태워야 한다. 단, 구명보트의 제한 몸무게 이내일 때만! 만약 가장 큰 몸무게 1명만으로 구명보트 제한 몸무게가 채워진다면 1개 더 사용해야 한다.
- 투 포인터를 활용해 구현했다
- 풀이에서는 pop을 활용하는 풀이였는데, 그 중에서도 자료 구조 큐(deque)를 활용해 구현했다,
풀이
- 나의 풀이
n, m = map(int, input().split())
arr = list(map(int, input().split()))
arr.sort()
# 투 포인터 활용!
s = 0
e = n-1
cnt = 0
while s <= e:
if arr[s] + arr[e] <= m:
s += 1
e -= 1
cnt += 1
print(cnt)
- 강의 풀이
from collections import deque
n, limit = map(int, input().split())
p = list(map(int, input().split()))
p.sort()
p = deque(p)
cnt = 0
while p:
# 마지막에 1명 남았을 경우 개별 처리
if len(p) == 1:
cnt += 1
break
if p[0] + p[-1] > limit:
p.pop()
cnt += 1
else:
p.popleft()
p.pop()
cnt += 1
print(cnt)
반응형
'알고리즘 삽질장' 카테고리의 다른 글
[인프런] 역수열 (0) | 2021.11.16 |
---|---|
[인프런] 증가수열 만들기 (0) | 2021.11.16 |
[인프런] 창고 정리 (0) | 2021.11.16 |
[인프런] 씨름 선수 (0) | 2021.11.16 |
[인프런] 회의실 배정 (0) | 2021.11.15 |