Algorithm/구현
[백준] 16472번 고냥이 (투포인터 문제)
HANNI하니
2023. 11. 3. 17:05
사용 언어 - Python3
문제 - 16472번 고냥이
투포인터 : 가능성을 지워주는 방법
https://www.acmicpc.net/problem/16472
16472번: 고냥이
고양이는 너무 귀엽다. 사람들은 고양이를 너무 귀여워했고, 결국 고양이와 더욱 가까워지고 싶어 고양이와의 소통을 위한 고양이 말 번역기를 발명하기로 했다. 이 번역기는 사람의 언어를 고
www.acmicpc.net
정답
(투포인터) 양쪽 끝에서 비교하면서 만나면 종료
알파벳 종류가 n넘지 않는지 확인 + 최대 개수 확인
arr.rstrip() 불필요한 공백 제거
s = 시작포인터 = 0
e = 끝포인터 = 0
letters = [] 알파벳 종류 넣을 리스트
letters.append(arr[s]) 첫번째 값을 일단 넣고 시작
dist = 0 인식할 수 있는 최대 개수
s와 n이 len(arr)를 넘지 않는 구간일 때 반복문 진행
1. len(letters) <= n 인식할 수 있는 알파벳 개수라면,
한개 더 인식 e += 1
arr[e] 가 letters에 있지 않다면 = 겹치는 문자가 아니라면, letters.append(arr[e])
2. len(letters) > n 인식할 수 없는 알파벳 개수라면, 리셋 + 초기화
s = s+1
e = s
letters = [arr[s]]
해당 s+1 위치부터 새롭게 시작
dist = max(dist,e-s+1) = 인식할 수 있는 문자열의 최대 개수 = max로 더 큰 값 있으면 계속 update
print(dist)
![](https://blog.kakaocdn.net/dn/bxqvBl/btszGLhCziZ/u3GhBhuUIfxCFKdbAygOkk/img.png)
import sys
input = sys.stdin.readline
n = int(input()) # 번역기가 인식할 수 있는 알파벳 최대 개수
arr = list(input().rstrip()) # 문자열 알파벳 소문자
s = 0
e = 0
letters = []
letters.append(arr[s]) # 맨 앞 1개 인식하고 시작
dist = 0
while s < len(arr) and e < len(arr):
dist = max(dist,e-s+1)
if len(letters) <= n: # 인식할 수 있는 알파벳 개수라면
e += 1 # 한 개 더 인식
if e < len(arr) and arr[e] not in letters:
letters.append(arr[e]) # 해당 알파벳 추가
if len(letters) > n: # 인식할 수 없다면 리셋! 새롭게 시작
s = s+1
e = s
letters = [arr[s]]
print(dist)
레퍼런스
- 깃허브 정답
https://github.com/yyeongeun/codingtest/blob/main/BAEKJOON/16472_%EA%B3%A0%EB%83%A5%EC%9D%B4.py