one line of code at a time

[leetcode] 1456. Maximum Number of Vowels in a Substring of Given Length 파이썬 코드 본문

leetcode

[leetcode] 1456. Maximum Number of Vowels in a Substring of Given Length 파이썬 코드

oloc 2024. 8. 13. 06:14

https://leetcode.com/problems/maximum-number-of-vowels-in-a-substring-of-given-length/description/

 

문자열 s에서 길이가 k인 substring 중 모음(vowel) 개수가 최대일 때 그 최댓값을 구하는 문제다.

 

s = "abciiidef", k = 3라고 할 때 iii 가 모음 3개를 가지므로 정답은 3이다.

 

k의 길이가 fixed 되어 있으므로 sliding window로 풀면 된다. 

 

그런데 살짝 헷갈렸던 게 window를 한 칸 씩 옮길 때 최댓값이 있으면 그 값을 업데이트 해줘야 하는데

그 업데이트를 할 때 (그 다음 값이 모음이면 +1, 그 이전 값이 모음이었으면 -1) 그 이전값을 +1 하거나 -1 해줘야 한다는 것이다. 최댓값을 +1, -1 해주는 것이 아니라.

 

그래서 temp, prev, vowelCount 이렇게 변수를 3개를 썼다. 

vowelCount는 최댓값을 담는 변수이고,  temp는 업데이트를 해주는 값이고, prev는 이전값이다. 

 

window를 움직였을 때 +1 하거나 -1한 값인 temp와 vowelCount를 비교해줘서 더 큰 값이 새로운 최댓값이 된다.

 

class Solution(object):
    def maxVowels(self, s, k):
        vowels = set('aeiou')
        vowelCount = 0

        for i in range(k):
            if s[i] in vowels:
                vowelCount += 1

        # print(vowelCount)

        prev = vowelCount
        for i in range(len(s) - k):
            temp = prev
            start, end = s[i], s[i+k]
            if s[i+k] in vowels:
                temp += 1
            if s[i] in vowels:
                temp -= 1
            prev = temp # 이전값 저장 
            vowelCount = max(temp, vowelCount)
            
        return vowelCount