모험가 길드

Lee·2023년 1월 27일
0

알고리즘

목록 보기
19/24

문제

마을에 모험가 N명이 있다. 모험가 길드에서는 모험가 대상으로 공포도를 측정한다. 모험가 그룹을 안전하게 구성하고자 공포도가 X인 모험가ㅡㄴ 반드시 X명 이상으로 구성한 모험가 그룹에 참여해야 한다.
최대 몇 개의 모험가 그룹을 만들 수 있는지 확인하시오

단 모든 모험가를 모험가 그룹에 넣을 필요는 없다.

입력 예시
5
2 3 1 2 2

출력 예시
2

나의 풀이

  1. 처음에는 공포도를 내림차순으로 정렬하여 큰 수의 공포도 만큼의 파티를 1개로 할당하는 방식을 사용했다.
    [3 2 2 2 1] -> 3이 가장 크므로 [3, 2, 2] 파티구성
    [2, 1] -> 2가 가장 크므로 [2, 1] 파티구성
    이것을 slice를 활용해 구현했다.
result = 0

    while fear:
        if len(fear) < fear[0]:
          break
        fear = fear[fear[0]:]
        result += 1
    print(result)
  1. 그러나 모든 모험가를 그룹에 넣을 수 없다는 조건을 생각해 보니 최대의 모험가 그룹 숫자를 구하기 위해서는 오름차순을 사용해 작게 구성할 수 있는 모험가 그룹을 가능한 많이 만들어야 한다는 것을 알게 되었다.
    따라서 공포도가 작은 순서대로 그룹에 집어 넣은 후
    그룹 인원수 >= 마지막에 들어온 멤버의 공포도인 경우 그룹을 생성하도록 변경하였다.
    [1 2 2 2 3]
    -> [1] len([1]) >= 1 파티 생성
    -> [2] len([2]) < 2 추가 모집
    -> [2, 2] len([2, 2]) >= 2 파티 생성
    -> [2] len([2]) < 2 추가 모집
    -> [2, 3] len([2, 3]) < 3 추가 모집
    -> 인원 없음

코드

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

member = 0
party = 0

for elem in fear:
    member += 1
    if member >= elem:
        party += 1
        member = 0

print(party)
profile
발전하고 싶은 백엔드 개발자

0개의 댓글