2 minute read


sport

kakao 2019 다시풀기 2

무지의 먹방 라이브

hint

회전하며 배열에서 음식을 1씩 소비한다고 했을 때, k번째 소비하게 되는 음식 (인덱스) 찾기

n 20만, 원소 10억이므로, 반드시 효율적으로 풀어야 한다. O(nlgn) 수준 이하로 해야 함.

어떻게?

ㅁㅁㅁㅁㅁㅁㅁ ㅁㅁㅁㅁ ㅁㅁㅎㅁㅁㅁ ㅁㅁㅁㅁㅁㅁㅁㅁ ㅁㅁㅁㅁㅁ

어떤 수에 대해, 나온 전체 수를 알 수 있지 않나? 정렬한 다음, 이분탐색으로 위치를 찾으면, 그 수 이하의 수가 몇개인지 알 수 있으므로, 어떤 수에 대해 총합 얼마가 나왔는지 알 수 있다. 그 총합이 k이하 어떤 수가 되도록 한 후, 남은 컬럼들 중에서 %N 만큼 이후의 컬럼을 선택하면 된다.

과정:

ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ (1, 10) ㅁㅁㅁㅁ (2, 4) ㅁㅁㅁㅁㅁ (3, 5) ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ (4, 11) ㅁㅁㅁㅁㅁㅁㅁㅁ (5, 8)

ㅁㅁㅁㅁ (2, 4) ㅁㅁㅁㅁㅁ (3, 5) ㅁㅁㅁㅁㅁㅁㅁㅁ (5, 8) ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ (1, 10) ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ (4, 11)

k=23이라 하면, 먼저 k보다 작은 최대의 합을 만드는 수 p를 찾아야 한다. p=3 -> 15 p=4 -> 20 p=5 -> 29

따라서 p=4, 남은 수 l=k-p=3이고, 열이 남은 컬럼들은 3,5,1,4이므로 세 번째인 (1,10)이 답이 된다.

문제는, 이분탐색으로 p를 찾는 구현이 좀 복잡할 듯하다.. 또, p가 주어졌을 때 합을 어떻게 찾는가..

아니면, 정렬해놓고, 각 컬럼간 차이들을 구해서, 이를 이용해서 구할 수 없을까.. 첫 높이 h1 -> h1*n만큼 커버됨. 그 다음 높이 h2 -> (h2-h1)*n … 만큼씩 커버가 된다.

그러면, 앞에서부터 k를 빼가면서 비교하면 된다. 그러다가, k가 모자란 시점에, 그 높이에서 남은 컬럼의 수…

다시 해당 높이에서 이분탐색…? p개의 cols 중에 k번째..

ㅁㅁ ㅁㅁ ㅂㅂㅂㅁㅁ ㅂㅂㅂㅎㅁㅁ ㅂㅂㅂㅁㅁㅁㅁㅁ

이 경우, 높이가 최소 보장이 되므로, xH < k인 최대 정수 x를 찾아서, xH+i=k라 할 때 i가 답이 된다. 다만, 높이를 N을 곱해야 하나 아니면 N-cur를 해야 하나?

남은 컬럼들에 대한 계산이므로, cur를 빼야 한다. 또한 N==cur즉 남은 음식이 없는 경우 처리도 필요

추가: 알고보니 저렇게 복잡하게 계산할 것 없이, k % (높이) 만 계산하면 되는 것이었다.

py solution

def solve(food_times, k):
    cur = -1
    left = 0
    N = len(food_times)
    cols = []
    for i,v in enumerate(food_times):
        left+=v
        cols.append((v, i+1))

    cols.sort()
    diffs = [cols[0][0]]
    for i in range(N-1):
        diffs.append(cols[i+1][0] - cols[i][0])
    cur = 0
    while True:
        if(cur == N):
            break
        nextv = diffs[cur]

        if(k>=nextv * (N-cur)):
            k -= nextv * (N-cur)
            cur+=1
        else:
            break
        pass

    cols = cols[cur:]
    
    cols.sort(key=takeSecond)

    if(N==cur):
        return -1
    x = math.floor(k/(N-cur))

    k -= x*(N-cur)
    
    return cols[k][1]

ㅁㅁㅁㅁ ㅁㅁㅁㅁㅁㅁ ㅁㅁㅁㅁㅁㅁ ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ ㅁㅁㅁㅁㅁㅁ ㅁㅁㅁㅁㅁㅁㅁㅎㅁㅁㅁㅁㅁ ㅁㅁㅁㅁㅁㅁ ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ ㅁㅁㅁㅁㅁㅁ ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ ㅁㅁㅁㅁㅁㅁ ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ ㅁㅁㅁㅁㅁㅁ ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ ㅁㅁㅁㅁㅁㅁ ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ ㅁㅁㅁㅁㅁㅁ ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ ㅁㅁㅁㅁㅁㅁ ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ

x * (N-cur) + k

project

pseudo

다음 항목들에 대한 통계 업데이트 필요. 어떻게 할 것인가? 주기적 업데이트로 유저의 해당 항목들 조사.

  post: Joi.number().default(0),
  vote: Joi.number().default(0),
  comment: Joi.number().default(0),
  study: Joi.number().default(0),
  answer: Joi.number().default(0),
  question: Joi.number().default(0)

Comments