728x90
반응형
https://www.acmicpc.net/problem/16472
16472번: 고냥이
고양이는 너무 귀엽다. 사람들은 고양이를 너무 귀여워했고, 결국 고양이와 더욱 가까워지고 싶어 고양이와의 소통을 위한 고양이 말 번역기를 발명하기로 했다. 이 번역기는 사람의 언어를 고
www.acmicpc.net
최종 코드
GitHub - hwayeon351/BEAKJOON-Algorithms: 백준 알고리즘 소스 코드 모음
백준 알고리즘 소스 코드 모음. Contribute to hwayeon351/BEAKJOON-Algorithms development by creating an account on GitHub.
github.com
N = int(input())
text = input()
if len(text) == 1:
print(1)
elif len(set(text)) <= N:
print(len(text))
else:
left = 0
right = 1
sets = set([text[left]])
ans = 0
while left < len(text)-1:
if right == len(text):
ans = max(ans, right-left)
break
sets.add(text[right])
if len(sets) == N:
ans = max(ans, right-left+1)
right += 1
elif len(sets) > N:
sets.clear()
left += 1
sets.add(text[left])
right = left + 1
else:
right += 1
print(ans)
풀이 과정
풀이 시간 35분
N = int(input())
text = input()
#문자열 길이가 1인 경우, 번역기가 인식할 수 있는 최대 문자열의 길이는 1이다
if len(text) == 1:
print(1)
#문자의 종류가 N보다 적게 구성된 문자열이라면, 문자열의 길이가 번역기가 인식할 수 있는 최대 문자열 길이다
elif len(set(text)) <= N:
print(len(text))
else:
left = 0
right = 1
sets = set([text[left]])
ans = 0
while left < len(text)-1:
#마지막 문자까지 번역이 가능한 경우, 정답 갱신 후 while문을 종료한다(다음을 탐색할 필요가 없다)
if right == len(text):
ans = max(ans, right-left)
break
#right 포인터에 있는 문자를 계속 sets에 추가해나가며 문자 종류의 개수를 체크한다
sets.add(text[right])
#문자 종류가 N개가 된 경우, 정답 갱신 후 다음 문자를 탐색하기 위해 right 포인터 값을 1 늘린다
if len(sets) == N:
ans = max(ans, right-left+1)
right += 1
#문자 종류가 N개를 초과한 경우, sets를 초기화하고 left 포인터 값과 right 포인터 값을 조정한다
elif len(sets) > N:
sets.clear()
left += 1
sets.add(text[left])
right = left + 1
#문자 종류가 N개 미만인 경우, 다음 문자 탐색을 위해 right 포인터 값을 1 늘린다
else:
right += 1
print(ans)
#시간복잡도 = O(n), 공간복잡도 = O(n)
728x90
반응형
'코테 노트 > 백준' 카테고리의 다른 글
백준 17837 새로운 게임 2 C++ (0) | 2021.10.05 |
---|---|
백준 17143 낚시왕 C++ (0) | 2021.10.05 |
백준 3649 로봇 프로젝트 Python3 (0) | 2021.10.04 |
백준 19237 어른 상어 C++ (4) | 2021.10.04 |
백준 17822 원판 돌리기 C++ (0) | 2021.10.03 |