15823 카드 팩 구매하기

정민용·2024년 3월 23일

백준

목록 보기
275/286

import sys

n, m = map(int, sys.stdin.readline().split())
card = list(map(int, sys.stdin.readline().split()))

start, end = 1, (n // m) + 1
res = 1
while start <= end:
    mid = (start + end) // 2

    card_pack = set()
    l, r = 0, 0
    cnt = 0
    while l <= r < n and l < n:

		# 카드 중복 확인
        # 중복 시 중복된 카드까지 이전 카드들을 모두 지움
        if card[r] in card_pack:
            while card[l] != card[r]:
                if card[l] in card_pack:
                    card_pack.remove(card[l])
                l += 1
            l += 1

        card_pack.add(card[r])

		# 한 카드 팩의 카드가 mid개가 된다면 다음 카드팩으로
        if (r - l + 1) == mid:
            cnt += 1
            card_pack = set()
            l = r+1
        if r < n-1:
            r += 1
            
    if cnt >= m:
        res = max(res, mid)
        start = mid + 1
    else:
        end = mid - 1

sys.stdout.write(str(res))
PyPy3 대신 Python3 로 제출하면 시간초과 발생

15823 카드 팩 구매하기

0개의 댓글