- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/42885
Level2 문제다!
문제 이해
하나의 보트에 최대 2명, 두 사람의 무게 합이 보트 제한 무게보다 적어야 한다
만약 이웃한 두 사람의 무게의 합이 무게 제한보다 크다면 각각 하나씩 타야한다
풀이 이해
사용하는 보트 수가 최소가 되기 위해서는 남은 사람 중 몸무게가 가장 작은 사람과 가장 큰 사람을 같이 태워야한다(최적해)
이걸 알기위해 people 리스트를 오름차순 정렬해주고, 빠르게 연산하기 위해 deque()선언을 해준다
남은 사람이 한 사람이라면 보트 수만 추가하고 끝낸다
남은 사람이 2명 이상이고, 남은 사람 중 가장 가벼운 사람과 무거운 사람이 보트를 탈 수 있을 때 보트를 추가해주고,
양 끝 원소를 삭제해준다
아닌 경우라면 그냥 각자 하나씩 보트를 탄다
- 정답 풀이 :
from collections import deque
def solution(people, limit):
people.sort()
answer = 0
people = deque(people)
while people:
if len(people) == 1:
answer += 1
break
#가장 무거운 사람과 가장 가벼운 사람이 탈 수 있을 때
elif people[0] + people[-1] <= limit:
answer += 1
people.pop()
people.popleft()
#가장 무거운 사람이 하나의 보트만 탄다
else:
answer += 1
people.pop()
return answer
- 시도해본 풀이 :
지금보니 완전 삽질한 풀이다,,,
정렬한 후 0 인덱스부터 시작해서 보트에 2명이 있다면 다음 보트를 넘기고
1명이 있고, 보트에 탄 사람의 무게와 아직 보트에 없는 사람의 무게 합이 제한 무게 이하면 추가하고
아니면 각자 타는 걸로 생각했는데
뭔가 풀이가 명확하지가 않다
명확하게 해보자
def solution(people, limit):
people.sort()
count = 1 #보트 수
boat = 1 #보트에 있는 사람 수
weight = people.pop(0) #보트에 있는 사람의 총 무게
for person in people:
if boat == 2:
count += 1
boat = 1
weight = person
elif boat < 2:
if weight + person <= limit:
weight += person
boat += 1
else:
boat = 1
count += 1
weight = person
return count
'프로그래머스 > Level 2' 카테고리의 다른 글
[ 스택,큐 / 프로그래머스] 42587번 : 프린터 (0) | 2022.09.19 |
---|---|
[해시 / 프로그래머스] 42577번: 전화번호 목록 (0) | 2022.09.19 |
[해시 / 프로그래머스] 42578번 : 위장 (0) | 2022.09.15 |
[정렬 / 프로그래머스] 42747번: H - index (0) | 2022.09.11 |
[완전탐색 / 프로그래머스] 42842번 : 카펫 (0) | 2022.09.09 |