코테 노트/백준

백준 16472 고냥이 Python3

화요밍 2021. 10. 4. 20:13
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