λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸƒ algorithm/boj

BOJ 16472 - κ³ λƒ₯이

by HandHand 2021. 3. 14.

문제

λ°±μ€€ 온라인 저지 - 16472번

풀이 κ³Όμ •

μ΅œλŒ€ N 개의 μ’…λ₯˜μ˜ μ•ŒνŒŒλ²³μ„ 가진 μ—°μ†λœ λ¬Έμžμ—΄μ€‘μ—μ„œ 인식할 수 μžˆλŠ” μ΅œλŒ€ λ¬Έμžμ—΄μ˜ 길이λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.
μ΅œλŒ€ λ¬Έμžμ—΄μ˜ 길이가 100,000 이기 λ•Œλ¬Έμ— μ™„μ „ 탐색 을 μ΄μš©ν•  경우 μ‹œκ°„ μ΄ˆκ³Όκ°€ λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€.

λŒ€μ‹  투 포인터 λ₯Ό μ΄μš©ν•΄μ„œ N 을 μ΄ˆκ³Όν•  경우 μ•ŒνŒŒλ²³μ˜ μ’…λ₯˜κ°€ N 보닀 μž‘μ•„μ§ˆ λ•ŒκΉŒμ§€ left λ₯Ό μ¦κ°€μ‹œν‚€κ³ 
N 보닀 κ°™κ±°λ‚˜ μž‘μ„ 경우 right 을 μ¦κ°€μ‹œν‚€λŠ” 방법을 μ‚¬μš©ν•˜λ©΄ μ΅œμ ν™”κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.
μ΄λ•Œ 각 μ•ŒνŒŒλ²³μ˜ λ“±μž₯ 횟수λ₯Ό κΈ°λ‘ν•˜κΈ° μœ„ν•΄ deque λ₯Ό κ°’μœΌλ‘œ μ‚¬μš©ν•˜λŠ” dict λ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.

각각의 deque μ—λŠ” μ•ŒνŒŒλ²³μ˜ μΈλ±μŠ€κ°€ μ €μž₯되며 μ•ŒνŒŒλ²³μ˜ μ’…λ₯˜κ°€ N 보닀 λ§Žμ•„μ‘Œμ„ μ‹œ
κ°€μž₯ μ™Όμͺ½μ— μžˆλŠ” μ•ŒνŒŒλ²³μ„ ν‚€λ‘œ ν•˜λŠ” deque μ—μ„œ ν•˜λ‚˜ dequeue ν•©λ‹ˆλ‹€.
μ΄λŸ¬ν•œ 연산을 N 보닀 κ°™κ±°λ‚˜ μž‘μ•„μ§ˆλ•ŒκΉŒμ§€ λ°˜λ³΅ν•˜λ©° 길이λ₯Ό ν•˜λ‚˜μ”© 쀄여가며 κ²€μ‚¬ν•˜λ©΄ λ©λ‹ˆλ‹€.
(λ§Œμ•½ deque κ°€ λΉ„μ›Œμ§ˆ 경우 ν•΄λ‹Ήν•˜λŠ” μ•ŒνŒŒλ²³μ„ dict μ—μ„œ μ§€μ›Œμ€λ‹ˆλ‹€.)

μ½”λ“œ


import sys
from collections import deque

N = int(input())
S = sys.stdin.readline().strip()


def solution():
    memo = {}
    left, right = 0, 0
    answer = 1

    memo[S[right]] = deque([0])

    while left <= right:
        right += 1
        if right >= len(S):
            break

        if S[right] in memo:
            memo[S[right]].append(right)
        else:
            memo[S[right]] = deque([right])

        # λ²ˆμ—­κΈ° 인식 λ²”μœ„λ₯Ό λ„˜μ–΄μ„€ 경우
        while len(memo) > N and left <= right:
            leftmost = S[left]
            memo[leftmost].popleft()
            if not memo[leftmost]:
                memo.pop(leftmost)
            left += 1

        length = right - left + 1
        answer = max(answer, length)

    return answer


print(solution())
λ°˜μ‘ν˜•

'πŸƒ algorithm > boj' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

BOJ 14620 - 꽃길  (0) 2021.03.14
BOJ 2688 - 쀄어듀지 μ•Šμ•„  (0) 2021.03.14
BOJ 17086 - μ•„κΈ° 상어2  (0) 2021.03.08
BOJ 13335 - 트럭  (0) 2021.03.08
BOJ 6497 - μ „λ ₯λ‚œ  (0) 2021.03.08

πŸ’¬ λŒ“κΈ€