본문 바로가기

알고리즘 삽질장

[인프런] 침몰하는 타이타닉

반응형


문제설명

타이타닉 유람선이 침몰하고 있다. 유람선에는 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