문제: 48 구명보트
- 초기 생각.
- 내림차순 정렬한 뒤, 하나씩 체크해주면 되지 않을까?
def solution(people, limit):
boat, cnt = 0, 1
people = sorted(people)
for i in people:
if boat+i <= limit:
boat += i
else:
boat = i
cnt += 1
return cnt
print(solution([70, 80, 50], 100))
- 틀림
- 왜냐하면,
[50,40,40,60,60,50]
이 주어진다면 - 단순히 정렬하면
[40,40,50,50,60,60]
이 되어서 - 구명보트가 4개가 필요하지만,
[40,60],[50,50],[40,60]
으로 묶는다면 3개면 되기 때문이다.-
무인도에 갇힌 사람은 5만명 이하라고 했기 때문에, 효율성 테스트 또한 고려 해야한다.
- 주의사항.
- for문을 돌 때,
range(len(array))
와 같은 방식 사용시, 중간에 array의 길이가 바뀐다고 해도, 초기에 들어있는 값대로 for문이 진행된다. -
따라서 중간에 값이 바뀐다면, while을 사용해주는 게 좋다.
- 예시 코드
array = [1, 2, 3, 4, 5]
array2 = [1, 2, 3, 4, 5]
for i in range(len(array)):
array.pop(-1)
print(i, len(array))
# 0 4 \n 1 3 \n 2 2 \n 3 1 \n 4 0\n 출력
idx = 0
while(idx < len(array2)):
array2.pop(-1)
print(idx, len(array2))
idx += 1
# 0 4 \n 1 3 \n 2 2\n 출력
참고답안
- for문을 2개 쓰면 통과하기 힘들다
- 가장 몸무게가 작은 사람과 무거운 사람과 매칭을 해보는 방법으로 진행할 수 있다.
- 가장 작은 사람의 무게와 무거운 사람의 무게가 limit 보다 작다면, 탑승할 수 있으므로
- count를 한개 늘리고 light의 인덱스를 1 증가, heavy 인덱스 1 감소
- 만약 limit 보다 크다면 heavy의 인덱스 1 감소
- 이를 light의 인덱스가 heavy의 인덱스를 앞지를 때까지 반복
- 이후 최종 구명보트의 수는, people의 전체 길이에서 count 값을 뺸 값이 된다
def solution(people, limit):
people.sort()
length = len(people)
light = 0
heavy = length-1
count = 0
while light < heavy:
if people[light] + people[heavy] <= limit:
count += 1
light += 1
heavy -= 1
else:
heavy -= 1
return length-count
print(solution([35, 50, 60, 70], 100))
참고자료 [프로그래머스]https://programmers.co.kr/learn/challenges [참고블로그]https://chaibin0.tistory.com/entry/%EA%B5%AC%EB%AA%85%EB%B3%B4%ED%8A%B8 [참고블로그]https://codedrive.tistory.com/46