Programming/백준

[실버 2] 백준 2790 - F7 (파이썬)

pental 2025. 6. 28. 18:09

https://www.acmicpc.net/problem/2790

풀이

N명의 학생이 있고 각 학생은 자신이 좋아하는 친구 수 B[i]를 갖고 있을 때, 가능한 한 많은 학생이 자신의 친구 수 조건을 만족하도록 친구를 맺도록 하는 것이다.

i번 학생은 정확히 B[i]명의 친구를 갖고 싶어한다

결국 이 문제는 B[i]명을 만족시키는 친구 매칭이 가능한 최대 학생 수를 구하는 것이다.

이를 해결하기 위해, 학생들을 좋아하는 친구 수 기준으로 정렬하고, 뒤에서부터 만족시킬 수 있는지 확인한다.

N = int(input())
B = [int(input()) for _ in range(N)]
B.sort()

학생수와 각 학생이 원하는 친구 수 B[i]를 리스트에 저장한 뒤 오름차순 정렬한다.

answer = 0
max_val = 0
for i in range(N - 1, -1, -1) :
    if B[i] + N >= max_val :
        answer += 1
    else :
        break

    max_val = max(max_val, B[i] + N - i)

i를 N - 1부터 0까지 역순으로 순회한다.

  • B[i] + N - i의 의미는?
    • 이 학생이 원하는 친구 수 B[i]를 만족하려면, 자기보다 친구를 더 적게 원하는 학생들 중 몇 명을 친구로 삼아야 함
    • N - i는 이 학생보다 작거나 같은 인덱스의 학생 수.
    • 그래서 B[i] + N - i는 이 학생이 요구하는 친구 수를 맞추기 위해 필요한 최소 범위.
  • max_val은 지금까지 본 학생 중 가장 높은 요구 범위이다.
  • 만약 현재 학생의 B[i] + N이 max_val보다 작으면, 더 이상 뒤에 있는 학생들은 이 조건을 만족할 수 없음 → break.
  • 만족 가능한 학생 수만큼 answer += 1.

코드

# 백준 2790 - F7
# 분류 : 그리디

import sys
input = sys.stdin.readline

N = int(input())
B = [int(input()) for _ in range(N)]
B.sort()

answer = 0
max_val = 0
for i in range(N - 1, -1, -1) :
    if B[i] + N >= max_val :
        answer += 1
    else :
        break

    max_val = max(max_val, B[i] + N - i)

print(answer)