1. 문제🔥
링크: https://www.acmicpc.net/problem/16564
요약하자면, 게임 캐릭터 개수 N과 올릴 수 있는 레벨 총합 K가 주어집니다. N명의 캐릭터에게 레벨 K를 골고루 올릴 때, 가능한 팀의 목표 레벨(팀에서 제일 낮은 캐릭터의 레벨)중 최대 값을 출력해야 합니다.
1) 예제 입출력❄️
3명의 캐릭터가 각각 레벨이 10, 20, 15인 경우 입니다. 올릴 수 있는 레벨은 10입니다. 골고루 분배했을 때, 최소 레벨의 최댓값을 구해야 합니다. 첫 번째 캐릭터에게 +7, 세 번째 캐릭터에게 +3 하면 레벨은 각각 17, 20, 18이 되어 최소 레벨이 17이 되며, 이게 최소 레벨의 최댓값입니다.
2. 핵심 논리☢️
찾고자 하는 팀의 목표 레벨(trg_level)을 찾기 위해, 그 레벨이 되는데 필요한 레벨 포인트(need_level)를 이분 탐색하는 것이 핵심입니다.
3. 풀이 코드✅
1) 코드
import sys
input=sys.stdin.readline
N,K=map(int,input().split())
x=[int(input()) for _ in range(N)]
s,e=min(x),max(x)+K
while s <= e:
trg_level=(s+e)//2
need_level = sum([trg_level-lv for lv in x if trg_level-lv >= 0])
if need_level <= K:
result = trg_level
s = trg_level + 1
elif need_level > K:
e = trg_level - 1
print(result)
캐릭터 수 N과 올릴 수 있는 레벨 K를 입력받고, x에 캐릭터별 레벨을 리스트로 저장합니다. 이분 탐색할 범위를 s(start)와 e(end)로 정의해주는데, 캐릭터 중 제일 낮은 레벨부터, 제일 높은 레벨 + K까지로 설정합니다. while 문을 돌며 이분 탐색을 하는데, 팀의 목표 레벨을 trg_level로 설정하고 그 레벨을 팀의 목표 레벨로 하는데 필요한 레벨을 need_level에 설정합니다. x에서 각 레벨 중 trg_level보다 낮은 레벨만 trg_level이 되는데 필요한 레벨 포인트를 모두 더해서 need_level을 계산합니다. need_level이 K 이하라면 필요한 레벨(need_level) 보다 올릴 수 있는 레벨(K)이 크거나 같은 경우로, 아직 여지가 있기 때문에 s = trg_level + 1을 해줍니다. 이때 result = trg_level로 갱신해주는데, 다음 need_level이 K보다 커지는 경우 현재 trg_level이 정답이기 때문입니다.
2) 주석 달린 코드
import sys
input=sys.stdin.readline
N,K=map(int,input().split()) # 캐릭터수 N과 올릴 수 있는 레벨 K
x=[int(input()) for _ in range(N)] # 캐릭터별 레벨 리스트
s,e=min(x),max(x)+K # 캐릭터중 제일 낮은 레벨 ~ 높은 레벨 + K 까지 이분탐색
while s <= e:
trg_level=(s+e)//2 # 팀의 목표레벨
need_level = sum([trg_level-lv for lv in x if trg_level-lv >= 0]) # 거기에 필요한 레벨
if need_level <= K: # 필요한 레벨보다 올릴 수 있는 레벨(K)이 크거나 같은 경우
result = trg_level # result를 갱신
s = trg_level + 1
elif need_level > K: # 필요한 레벨 보다 올릴 수 있는 레벨(K)이 작은 경우
e = trg_level - 1
print(result)
읽어주셔서 감사합니다.
다음에 더욱 유익한 글로 찾아오겠습니다.
* 관련 풀이 코드는 아래 깃허브 링크에 있습니다.
Reference)
1. BAEKJOON Logo: https://www.acmicpc.net/
'Programming > 알고리즘' 카테고리의 다른 글
[백준] 1309 - 동물원 🦁 (Python) / 실버 1 / DP (0) | 2022.11.07 |
---|---|
[백준] 17404 - RGB거리 2 🎨 (Python) / 골드 4 / DP (0) | 2022.11.06 |
[백준] 1300 - K번째 수 🖋️ (Python) / 골드 2 / 이분 탐색 (0) | 2022.10.29 |
[백준] 2143 - 두 배열의 합 🍻 (Python) / 골드 3 / 2가지 풀이 (Counter, bisect) (0) | 2022.10.29 |
[백준] 11000 - 강의실 배정 🏫 (Python) / 골드 5 / 정렬 (0) | 2022.10.24 |