일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Homebrew
- oracleapex
- 모놀리식
- DB
- MSA
- python
- 프로그래머스
- 의사결정나무모형
- 맥북
- 맥북환경설정
- 맥북셋팅
- Pass By Value
- 계정계
- union
- 컴퓨터공학학사취득
- SQL
- 은행IT
- 채널계
- jdk
- jdk17
- it자격증
- 개인프로필스튜디오창업
- 디렉토리계층구조
- fastapi
- 학점은행제무료강의
- 렌탈스튜디오창업
- 오라클
- 코어뱅킹
- 학점은행제
- 코딩테스트
- Today
- Total
개발머해니
[파이썬] 지각 벌금 적게 내기 분석 - 그리디 본문
실습 설명
익중이네 밴드부는 매주 수요일 오후 6시에 합주를 하는데요. 멤버들이 너무 상습적으로 늦어서, 1분에 1달러씩 내야 하는 벌금 제도를 도입했습니다.
그런데 마침 익중이와 친구 넷이 놀다가 또 지각할 위기입니다. 아직 악보도 출력해 놓지 않은 상황이죠.
어차피 같이 놀다 늦은 것이니 벌금을 다섯 명이서 똑같이 나눠 내기로 하고, 벌금을 가능한 적게 내는 방법을 고민해 보기로 합니다.
다섯 사람이 각각 출력해야 하는 페이지 수는 3장, 1장, 4장, 3장, 2장입니다. 프린터는 한 대밖에 없고, 1장을 출력하기 위해서는 1분이 걸립니다.
현재 순서대로 출력한다면,
첫 번째 사람: 3분 지각
두 번째 사람: 3+1분 지각
세 번째 사람: 3+1+4분 지각
네 번째 사람: 3+1+4+3분 지각
다섯 번째 사람: 3+1+4+3+2분 지각
총 39달러의 벌금을 내야 합니다.
흠… 더 적게 내는 방법이 있지 않을까요?
출력할 페이지 수가 담긴 리스트 pages_to_print를 파라미터로 받고 최소 벌금을 리턴해 주는 함수 min_fee를 작성해 보세요.
실습 결과
def min_fee(pages_to_print):
# 인풋으로 받은 리스트를 정렬시켜 준다
sorted_list = sorted(pages_to_print)
# 총 벌금을 담을 변수
total_fee = 0
# 정렬된 리스트에서 총 벌금 계산
for i in range(len(sorted_list)):
total_fee += sorted_list[i] * (len(sorted_list) - i)
return total_fee
# 테스트 코드
print(min_fee([6, 11, 4, 1]))
print(min_fee([3, 2, 1]))
print(min_fee([3, 1, 4, 3, 2]))
print(min_fee([8, 4, 2, 3, 9, 23, 6, 8]))
39
10
32
188
- 최적부분구조
- 탐욕적 속성
세 명이 각각 100장, 2장, 1장을 출력한다고 가정합시다. 만약 첫 번째 사람이 먼저 출력하면 세 명 모두 최소 100분을 기다려야겠죠. 반대로 마지막 사람이 먼저 출력을 하면 세 명 모두 최소 1분을 기다려야 합니다.
기다리는 시간을 최소화하기 위해서는, 페이지 수가 적은 사람 순으로 출력하는 것이 최선이라고 확신할 수 있습니다.
따라서 이 문제는 탐욕적 선택 속성도 있습니다.
- 시간 복잡도
인풋 리스트 pages_to_print의 길이를 O(nlogn)이라고 합시다. 그러면 리스트를 정렬시켜 주는 부분이
O(nlgn)이고 for문 부분이 O(n)이죠?
합하면 O(nlgn+n)
인데, 뒤에 있는 n을 생략할 수 있기 때문에 결국 시간 복잡도는 O(nlgn)입니다.
'알고리즘' 카테고리의 다른 글
[파이썬] 투자 귀재 규식이 Ⅰ (0) | 2023.09.30 |
---|---|
[파이썬] 수강 신청 분석 - 그리디 ★ (0) | 2023.09.30 |
[파이썬] 최대 곱 구하기 - 그리디 (0) | 2023.09.24 |
[파이썬] 최소 동전으로 거슬러 주기 - 그리디 (0) | 2023.09.24 |
[파이썬] 새꼼달꼼 장사 (2) Tabulation - 다이나믹 프로그래밍 ★ (0) | 2023.09.19 |