Algorithm & Problem Solving/투 포인터(Two Pointer)
[백준 16472] 고냥이 (Python)
baby_ohgu
2021. 1. 5. 00:53
16472번: 고냥이
고양이는 너무 귀엽다. 사람들은 고양이를 너무 귀여워했고, 결국 고양이와 더욱 가까워지고 싶어 고양이와의 소통을 위한 고양이 말 번역기를 발명하기로 했다. 이 번역기는 사람의 언어를 고
www.acmicpc.net
문제풀이
N, S : 입력값
check : 알파벳 개수
left, right : 투 포인터
tmp : 인식한 문자 개수
q : 현재 인식한 문자열
투 포인터(Two-Pointer) 를 이용하여 새로 인식한 글자와 문자열의 길이를 계산해 문자열의 최대 길이를 구할 수 있다.
1. 투 포인터를 이용해 왼쪽부터 오른쪽 방향으로 하나씩 글자를 인식한다.
- 인식한 문자 개수(tmp) 가 N 인데, 새로운 글자가 나타나면 ans 갱신
- 새로 인식한 문자 개수 증가
2. 왼쪽 인덱스를 증가시키면서 시작 문자를 변경한다.
- q(현재 인식한 문자열) 에 있는 가장 좌측 문자를 제거하고 해당 문자 개수 감소
- q에 가장 좌측 문자의 개수가 0이면 인식한 문자 개수(tmp) 감소
3. 1, 2 과정을 반복한다.
4. 결과(ans) 출력
코드
import sys
from collections import deque
if __name__ == '__main__':
N = int(input())
S = list(map(str, sys.stdin.readline().rstrip()))
check = [0] * 26 # 알파벳 개수 세기
size = len(S)
left, right = 0, 0 # 투 포인터
ans, tmp = 0, 0 # tmp : 인식한 문자 개수
q = deque() # 현재 인식한 문자열
while left < size and right < size:
while right < size:
if tmp == N and not check[ord(S[right]) - ord('a')]: # 인식한 글자 개수가 N인데 새로운 글자가 나타나면 break
break
if not check[ord(S[right]) - ord('a')]: # 인식한 글자 개수가 N개 이하일 때 새로운 글자 나타나면
tmp += 1 # 인식한 문자 개수 증가
check[ord(S[right]) - ord('a')] += 1 # 알파벳 개수 증가
q.append(S[right])
right += 1 # right 증가
ans = max(ans, len(q))
# 첫 문자 없애주기
first = q[0]
check[ord(first) - ord('a')] -= 1 # 첫 문자 알파벳 개수 감소
q.popleft()
if not check[ord(first) - ord('a')]: # 첫 문자 알파벳 개수가 0이면
tmp -= 1 # 인식한 문자 개수 감소
left += 1 # left 증가
print(ans)
결과
문제풀이나 코드에서 이상한 부분 지적은 언제나 환영합니다!