본문 바로가기
I can do it on my own!/우당탕탕

[이코테] 13강 문제 '모험가 길드'

by zivvon 2023. 5. 12.
목차 접기

문제

한 마을에 모험가가 N명 있습니다. 모험가 길드에서는 N명의 모험가를 대상으로 '공포도'를 측정했는데, '공포도'가 높은 모험가는 쉽게 공포를 느껴 위험 상황에서 제대로 대처할 능력이 떨어집니다.

 

모험가 길드장인 동빈이는 모험가 그룹을 안전하게 구성하고자 공포도가 X인 모험가는 반드시 X명 이상으로 구성한 모험가 그룹에 참여해야 여행을 떠날 수 있도록 규정했습니다.

 

동빈이는 최대 몇 개의 모험가 그룹을 만들 수 있는지 궁금합니다. N명의 모험가에 대한 정보가 주어졌을 때, 여행을 떠날 수 있는 그룹 수의 최댓값을 구하는 프로그램을 작성하세요.

 

예를 들어 N = 5이고, 각 모험가의 공포도가 '2 3 1 2 2'라고 가정합시다.

 

이 경우 그룹 1에 공포도가 1, 2, 3인 모험가를 한 명씩 넣고, 그룹 2에 공포도가 2인 남은 두 명을 넣게 되면 총 2개의 그룹을 만들 수 있습니다.

 

또한 몇 명의 모험가는 마을에 그대로 남아있어도 되기 때문에, 모든 모험가를 특정한 그룹에 넣을 필요는 없습니다.

 

문제 조건

풀이 시간 30분, 시간 제한 1초, 메모리 제한 128MB

 

입력

첫째 줄에 모험가의 수 N이 주어집니다.

둘째 줄에 각 모험가의 공포도의 값을 N 이하의 자연수로 주어지며, 각 자연수는 공백으로 구분합니다.

 

출력

여행을 떠날 수 있는 그룹 수의 최댓값을 출력합니다.


'문제 해결 아이디어'

오름차순 정렬 이후에 공포도가 가장 낮은 모험가부터 하나씩 확인하며 '현재 그룹에 포함된 모험가의 수'가 '현재 확인하고 있는 공포도'보다 크거나 같다면 이를 그룹으로 설정하기

ㄴ 정당성 분석 : 공포도가 오름차순으로 정렬되어 있다는 점에서, 항상 최소한의 모험가의 수만 포함하여 결성하게 됨

 

'정답 코드'

n = int(input())
arr = list(map(int, input().split()))
arr.sort() #오름차순 정렬

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

for i in arr :
  count += 1 # 현재 그룹에 해당 모험가 포함시키기

  # 현재 그룹에 포함된 모험가의 수가 현재의 공포도 이상이라면,
  # 그룹 결성 가능
  if count >= i :
    result += 1 #그룹 결성
    count = 0 # 현재 그룹에 포함된 모험가 수 초기화

print(result)

 

'공부한 것'

- sort() : list 객체 자체를 정렬해주는 함수, 기본적으로 리스트를 오름차순으로 정렬해주는 기능을 

~> 오직 리스트에서만 사용할 수 있음

~> reverse 옵션(매개변수) : 리스트.sort(reverse=False)가 디폴트 값

~> 오름차순 : 리스트.sort(), 리스트.sort(reverse=False)

~> 내림차순 : 리스트.sort(reverse=True)

 

- sorted() : 첫 번째 매개변수로 들어온 반복 가능한 데이터를 새로운 정렬된 리스트로 만들어서 반환해주는 기능

 

* sort() vs sorted()

- sort()는 본체의 리스트를 정렬해서 변환, sorted()는 본체 리스트는 그대로고 정렬한 새로운 리스트를 반환