2019 카카오 신입 공채
# 20210125
# CHAPTER11 Greedy
# Q06 무지의 먹방라이브
# 먹어야 할 음식 N개
# K ~ K+1 초에 먹을 음식 번호는?
import sys
sys.stdin = open("input.txt", "r")
def solution(food_times, k):
answer = -1
size_list = sorted(list(set(food_times)))
number_of_sizes = [0] * (size_list[-1] + 1)
for n in food_times:
number_of_sizes[n] += 1
# print(number_of_sizes)
# 누적배열만들기
for idx in range(len(size_list) - 1, 0, -1):
number_of_sizes[size_list[idx - 1]] += number_of_sizes[size_list[idx]]
# print(number_of_sizes)
# 한턴씩 음식먹기 (한턴 : 남은 음식을 모두 먹으려 시도하고 가능하면 먹고 다음턴, 불가능하면 거기에 정답존재)
prev_size = 0
for size in size_list:
# 가능한 경우 먹는다 (k초 소요)
if k >= (number_of_sizes[size] * (size - prev_size)):
k -= (number_of_sizes[size] * (size - prev_size))
prev_size = size
# 불가능한 경우 정답존재
else:
# 남은 음식 중 몇번째가 정답인지 cnt로 확인
cnt = (k+1) % number_of_sizes[size]
# cnt가 0인 경우는 k>=0이므로 남은 음식 수 == cnt 일때 위의 연산에서 0이 되는 경우 뿐
if cnt == 0:
cnt = number_of_sizes[size]
# print(cnt)
# 남은 음식 중 cnt 번째의 음식 찾기
for idx in range(len(food_times)):
if food_times[idx] >= size:
cnt -= 1
# print('cnt = ' + str(cnt) + 'idx = ' + str(idx))
if cnt <= 0:
answer = idx + 1
return answer
# 위의 for문을 모두 돌고났는데 return 되지 않았다는 것은 남은 음식이 없는 경우이다. (-1 반환)
return answer
K = int(input())
input_list = list(map(int, input().split()))
print(solution(input_list, K))
'SW > 알고리즘 문제풀이' 카테고리의 다른 글
문자열 재정렬 (0) | 2021.01.31 |
---|---|
럭키 스트레이트 (0) | 2021.01.31 |
만들 수 없는 금액 (0) | 2021.01.25 |
문자열 뒤집기 (0) | 2021.01.24 |
곱하기 혹은 더하기 (0) | 2021.01.24 |
Comment