❗[알고리즘]침몰하는 타이타닉

김도연·2024년 1월 13일

알고리즘

목록 보기
27/56

문제

유럽에서 가장 유명했던 유람선 타이타닉이 침몰하고 있습니다. 유람선에는 N명의 승객이 타고 있습니다. 구명보트를 타고 탈출해야 하는데 타이타닉에 있는 구명보트는 2명 이하로만 탈 수 있 으며, 보트 한 개에 탈 수 있는 총 무게도 M kg 이하로 제한되어 있습니다.
N명의 승객 몸무게가 주어졌을 때 승객 모두가 탈출하기 위한 구명보트의 최소개수를 출력하는 프로그램을 작성하세요.

▣ 입력설명
첫째 줄에 자연수 N(5<=N<=1000)과 M(70<=M<=250)이 주어집니다.
두 번째 줄에 N개로 구성된 몸무게 수열이 주어집니다. 몸무게는 50이상 150이하입니다. 각 승객의 몸무게는 M을 넘지는 않습니다. 즉 탈출을 못하는 경우는 없습니다.
▣ 출력설명
첫째 줄에 구명보트의 최소 개수를 출력합니다.

입력예제1

5 140
90 50 70 100 60

출력예제1

3

[해설코드1]

n, limit=map(int,input().split())
p=list(map(int,input().split()))
p.sort()
cnt=0
while p:
	//리스트에 한 명만 남아있는 경우
    if len(p)==1:
    	cnt+=1
        break
	//한 명이 타고 간 경우
	if p[0]+p[-1]>limit:
    	p.pop()
        cnt+=1
     //두 사람이 타고 간 경우
    else:
    	p.pop(0)
        p.pop()
        cnt+=1
print(cnt)

[해설코드2]

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:
	//리스트에 한 명만 남아있는 경우
    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)
  1. 리스트를 오름차순으로 정렬
  2. 가장 가벼운 사람과 가장 무거운사람의 몸무게를 합하고 몸무게가 초과한다면 그 다음으로 무거운 사람과 더한다.이때 제한몸무게 범위 내에 들어간다면 해당 요소를 pop
  3. 마지막에 리스트에 한 명이 남은 경우를 고려해야한다.p[0]과 p[-1]이 남은 한 명의 값으로 적용됨<-논리적 오류

0개의 댓글