📢 '이것이 코딩 테스트다 with 파이썬' 책을 공부하고 복습하기 위해 작성했습니다.
2023.12.06 - [Algorithm] - [이코테] 02. 그리디(Greedy) 알고리즘, 탐욕법, 욕심쟁이 알고리즘
[이코테] 02. 그리디(Greedy) 알고리즘, 탐욕법, 욕심쟁이 알고리즘
📢 '이것이 코딩 테스트다 with 파이썬' 책을 공부하고 복습하기 위해 작성했습니다. 그리디(Greedy) 알고리즘 (탐욕법) 현재 상황에서 지금 당장 좋은 것만 고르는 방법 순간 가장 좋아 보이는 것
imhihi.tistory.com
문제
모험가 길드에서는 N명의 모험가를 대상으로 "공포도"를 측정했다. "공포도"가 높은 모험가는 쉽게 공포를 느껴 위험 상황에서 제대로 대처할 능력이 떨어진다.
모험가 길드장은 모험가 그룹을 안전하게 구성하고자 공포도가 X인 모험가는 반드시 X명 이상으로 구성한 모험가 그룹에 참여해야 여행을 떠날 수 있도록 규정했다.
N명의 모험가에 대한 정보가 주어질 때, 여행을 떠날 수 있는 그룹의 최댓값을 구하라. 몇 명의 모험가는 마을에 그대로 남아있어도 되며, 모든 모험가를 특정한 그룹에 넣을 필요는 없다.
입력 조건
- 첫째 줄에 모험가의 수 N이 주어진다. (1 ≤ N ≤ 100,000)
- 둘째 줄에 각 모험가의 공포도의 값이 N 이하의 자연수로 주어지며, 각 자연수는 공백으로 구분한다.
출력 조건
- 여행을 떠날 수 있는 그룹 수의 최댓값을 출력한다.
입력 예시
5
2 3 1 2 2
출력 예시
2
문제 분석 및 알고리즘 설계
공포도가 낮은 모험가부터 그룹을 결성해 나간다.
- 모험가 배열을 공포도 순으로 정렬한다.
- 모험가 배열을 하나씩 순회하며 그룹에 추가한다.
- 한 그룹의 최대 공포도보다 사람 수가 많아지면, 그룹 하나가 결성된다.
나의 풀이
N = int(input())
arr = list(map(int, input().split()))
arr.sort()
# 총 그룹 수
result = 0
# 한 그룹에 속한 인원
cnt = 0
for i in range(N):
cnt += 1
# 사람수 >= 공포도인 순간, 그룹 결성
if cnt >= arr[i]:
result += 1
cnt = 0
print(result)
해설
공포도를 기준으로 오름차순으로 정렬한다. 이후 공포도가 가장 낮은 모험가부터 하나씩 확인하며, 그룹에 포함될 모험가의 수를 계산한다.
만약 현재 그룹에 포함된 모험가의 수가 현재 확인하고 있는 공포도보다 크거나 같다면, 그룹을 결성할 수 있다.
오름차순으로 정렬되어 있다는 점에서, 항상 최소한의 모험가의 수만 포함하여 그룹을 결성하게 된다. 따라서 최대한 많은 그룹이 구성되는 방법이다.
- 처음 풀이에서
max
를 사용해 최대 공포도를 계산하였는데, 오름차순으로 정렬이 되었다는 점에서 그룹의 최대 공포도는 현재 확인하는i
번째 값이다. max
를 제거하고, 공포도 값을arr[i]
로 교체했다.
'Algorithm' 카테고리의 다른 글
[이코테] 그리디 기출문제 - 3. 문자열 뒤집기 (0) | 2024.01.18 |
---|---|
[이코테] 그리디 기출문제 - 2. 곱하기 혹은 더하기 (0) | 2024.01.18 |
[이코테] 09. 그래프 이론 - 커리큘럼 (1) | 2024.01.15 |
[이코테] 09. 그래프 이론 - 도시 분할 계획 (1) | 2024.01.15 |