백준(BOJ)

[Python/파이썬] - 백준(BOJ) 16472번 : 고냥이

phanre 2022. 5. 7. 03:39

https://www.acmicpc.net/problem/16472

 

16472번: 고냥이

고양이는 너무 귀엽다. 사람들은 고양이를 너무 귀여워했고, 결국 고양이와 더욱 가까워지고 싶어 고양이와의 소통을 위한 고양이 말 번역기를 발명하기로 했다. 이 번역기는 사람의 언어를 고

www.acmicpc.net

 

간단한 두 포인터 문제이다.

첫 포인터 위치를 0번째, 1번째 인덱스로 잡은 후 var 변수를 이용하여 알파벳 종류 수를 센다.

이후 check 배열에 각각 인덱스마다 알파벳이 나올 때 마다 값을 증가시켜 갯수를 세며 temp를 증가시킨다.

우측 포인터를 증가시키다가 알파벳 종류가 n을 넘어가는 경우 우측 포인터를 멈추고

좌측 포인터가 가리키는 인덱스의 check 값이 0이 될 때 까지 좌측 포인터를 증가시키고 temp를 감소시킨다.

우측포인터를 증가시킬 때 마다 max 함수를 이용해 answer에 최댓값을 저장한다.

 

import sys
input = sys.stdin.readline
def sti(num):
    return int(ord(cat[num])-97)

n = int(input())
cat = str(input().strip())
if len(cat) <= n:
    print(len(cat))
else:
    answer = 0
    check = [0] * 26
    l = 0
    r = 1
    check[sti(l)] += 1
    var = 1
    if check[sti(r)] == 0:
        var += 1
    check[sti(r)] += 1
    temp = 2
    r += 1
    while r < len(cat):
        if check[sti(r)] == 0:
            var += 1
        check[sti(r)] += 1
        temp += 1
        while var > n:
            check[sti(l)] -= 1
            if check[sti(l)] == 0:
                var -= 1
            l += 1
            temp -= 1
        r += 1

        answer = max(answer, temp)
    print(answer)