문제
출처: 프로그래머스 - 구명보트
풀이
주어진 people에서 1명 혹은 2명으로 묶어서 그 길이를 구할 수도 있지만,
간단히 구명보트에 1명씩 태우는 경우를 default로 잡고 2명이 탈 수 있다면 전체 길이 default 값에서 -1씩 차감하여 구하여도 된다.
그리디 문제는 대부분 정렬을 해서 풀이를 진행한다.
왜냐하면 작은 부분에서의 진행 혹은 연산이 전체 부분 혹은 다른 작은 부분에 영향을 주지 않아야 하기 때문이다. 다시 말해 순차적으로 진행을 할 때, 앞 부분의 연산이 뒷 부분의 연산에 논리적은 영향을 주지 않아야 한다.
문제를 예로 들어서 people을 탐색할 때 무게를 기준으로 limit과 비교하여 연산하여 진행을 한다. people에 들어있는 사람들의 무게를 정렬하면 첫번째 사람이 limit 보다 몸무게가 만약 높다면 정렬을 했기 때문에 뒤의 사람은 더 볼 필요가 없다. 논리적인 연산을 진행할 수 있게 된다.
코드
def solution(people, limit):
n = len(people) # 전체 길이 default 값
answer = 0 # 2명이 탄 횟수
s = 0 # 시작 인덱스
e = len(people) - 1 # 마지막 인덱스
people.sort() # 정렬
while s < e: # 점점 중앙으로 인덱스가 좁혀오는 형상
if people[s] + people[e] <= limit:
answer += 1
s += 1
e -= 1
else:
e -= 1
return n - answer