모험가 길드 문제는 공포도가 x인 모험가는 반드시 x명 이상으로 구성한 모험가 그룹에 참여해야 여행을 떠날 수 있습니다.

첫째줄에 n이 주어지고 둘째 줄에 각 모험가의 공포도의 값을 N 이하의 자연수로 주어집니다.

모든 모험가를 특정한 그룹에 넣을 필요는 없습니다.

여행을 떠날 수 있는 그룹 수의 최대값을 구하는 프로그램을 작성하세요.

<나의 풀이>

from collections import deque

if __name__ == '__main__':
    n = int(input())
    list1 = list(map(int, input().split()))
    list1.sort(reverse=True)
    arr = deque(list1)
    result = 0

    while arr:
        x = arr[0]

        if x <= len(arr):
            for i in range(x):
                arr.popleft()
        else:
            break
        result += 1

    print(result)

나의 풀이는 잘못 되었습니다. 해당 알고리즘은 그리디가 적용되어야 됩니다. 하지만 저는 가장 공포도가 높은 모험가를

먼저 파티에 넣는 식으로 하였기 때문에 그룹의 수는 가작 적은 그룹의 수가 리턴 될 것입니다. 그것을 알고도 위와같은 알고리즘을 사용한 것은 가장 큰 값을 기준으로 해야 나중에 뒤에서 더 큰 공포를 가진 모험가가 나타나서 위 조건을 이탈하는 케이스를 생각했기 때문입니다.

아래는 정답입니다.

n = int(input())
data = list(map(int, input().split()))
data.sort()

result = 0 # 총 그룹의 수
count = 0 # 현재 그룹에 포함된 모험가의 수

for i in data: # 공포도를 낮은 것부터 하나씩 확인하며
	count += 1
    if count >= i:
    	result += 1
        count = 0

 

정답을 보면 if count >= i:

라는 조건이 있습니다. 해당 조건 덕분에 뒤에서 갑자기 공포도가 큰 모험가가 포함 되어도 공포도가 x인 모험가는 반드시 x명 이상으로 구성한 모험가 그룹에 참여해야 여행을 떠날수 있는 조건을 만족할 수 있습니다.

 

'알고리즘' 카테고리의 다른 글

[이코테] 문자열 재정렬  (0) 2022.01.04
볼링공 고르기[이코테] 그리디  (0) 2022.01.03
백준 피보나치의 수5  (0) 2021.12.29
백준 설탕 배달 dp  (0) 2021.12.26
떡복기 떡 만들기 이진 탐색  (0) 2021.12.20

+ Recent posts