이코테) 그리디 기출문제 01. 모험가 길드
한 마을에 모험가가 N명 있습니다. 모험가 길드에서는 N명의 모험가를 대상으로 '공포도'를 측정했는데, '공포도'가 높은 모험가는 쉽게 공포를 느껴 위험 상황에서 제대로 대처할 능력이 떨어집니다. 모험가 길드장인 동빈이는 모험가 그룹을 안전하게 구성하고자 공포도가 X인 모험가는 반드시 X명 이상으로 구성한 모험가 그룹에 참여해야 여행을 떠날 수 있도록 규정했습니다. 동빈이는 최대 몇 개의 모험가 그룹을 만들 수 있는지 궁금합니다.
동빈이를 위해 N명의 모험가에 대한 정보가 주어졌을 때, 여행을 떠날 수 있는 그룹 수의 최댓값을 구하는 프로그램을 작성하시오.
예를 들어 N=5이고, 각 모험가의 공포도는 다음과 같다고 가정합시다.
2 3 1 2 2 |
이때, 그룹 1에 공포도가 1, 2, 3인 모험가를 한 명씩 넣고, 그룹 2에 공포도가 2인 남은 두 명을 넣게 되면, 총 2개의 그룹을 만들 수 있습니다. 또한 몇 명의 모험가는 마을에 그대로 남아 있어도 되기 때문에, 모든 모험가를 특정한 그룹에 넣을 필요는 없습니다.
입력 조건
- 첫째 줄에 모험가의 수 N이 주어집니다. (1 <= N <= 100,000)
- 둘째 줄에 각 모험가의 공포도의 값을 N 이하의 자연수로 주어지며, 각 자연수는 공백으로 구분합니다.
출력 조건
첫째 줄에 M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 출력한다.
❧ 입력 예시
5
2 3 1 2 2
❧ 출력 예시
2
❧ 정답
그리디 알고리즘) 현재 상황에서 가장 큰 인원을 무조건 먼저 선택하여 현재 선택된 모험가의 공포도에 맞춰, 남은 인원을 채워넣어서 하나의 그룹을 만드는 방식으로 문제 풀이를 진행했다.
우선 받아온 모험가의 정보를 공포도의 내림차순으로 정렬하여, 공포도가 높은 순서대로 정렬을 수행한다.
이후 for문의 경우에는 모험가 목록 중 맨 처음 시작하는 모험가를 선택하는 역할을 수행한다.
g 변수의 경우, pivot의 역할로, 그룹을 새롭게 만들기 위해 필두가 되는 모험가의 인덱스이다.
남은 인원으로 새로운 그룹을 만들 수 없을 때까지 반복하고 g의 값을 다시 조정한다.
이후, group 리스트에서 지금 나온 N개의 경우의 수 중 가장 그룹의 수가 많은 경우를 출력한다.
'📊 Algorithm > Algorithm PS' 카테고리의 다른 글
[알고리즘 일기] 157. 만들 수 없는 금액 (0) | 2022.01.19 |
---|---|
[알고리즘 일기] 156. 뒤집기 (0) | 2022.01.18 |
[알고리즘 일기] 154. 곱하기 혹은 더하기 (0) | 2022.01.16 |
[알고리즘 일기] 142. 위클리 챌린지 5주차_모음사전 (0) | 2021.09.21 |
[알고리즘 일기] 104. 그룹 단어 (0) | 2021.08.20 |