
--> set을 이용해서 중복되는 것을 다 지우고, 그 set을 적용한 반환값의 length값을 구하면 된다고 생각했다. 하지만...

그렇게 간단하게 끝날리가 없다.
'contiguous sequence'를 까먹고 있었다.
그래서 어떻게 풀어야할지 몰라 그냥 풀이과정을 보고 이해하기로 했다.
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
charSet = set()
l = 0
res = 0
for r in range(len(s)):
while s[r] in charSet: #현재 오른쪽 포인터 r이 가리키는 문자 s[r]이 charSet에 있는지 확인하고 있으면 반복
charSet.remove(s[l]) #왼쪽 포인터 l이 가리키는 문자를 지움
l += 1 #l은 다음 으로 이동
charSet.add(s[r]) #s[r]이 charSet에 없으면 s[r]을 추가
res = max(res, r - l + 1)
#res는 지금까지 나왔던 res의 max값과 오른쪽 포인터에서 왼쪽 포인터를 빼고 1을 더한값(문자열의 길이) 중 최대값을 구함.
#+1을 더하는 이유는 인덱스는 0부터 시작하니까
return res
Chat GPT말로는 슬라이딩 윈도우 (Sliding Window) 알고리즘이라고 한다.
def lengthOfLongestSubstring(s: str) -> int:
charSet = set() # 중복 문자를 추적하는 set
l = 0 # 슬라이딩 윈도우의 왼쪽 포인터
max_len = 0 # 결과 값 저장
for r in range(len(s)): # 오른쪽 포인터로 문자열을 순회
# 중복된 문자가 있으면 왼쪽 포인터를 이동하면서 중복 제거
while s[r] in charSet:
charSet.remove(s[l])
l += 1
# 중복 없는 문자를 추가하고 최대 길이 갱신
charSet.add(s[r])
max_len = max(max_len, r - l + 1)
return max_len
def maxSum(arr, k):
window_sum = sum(arr[:k]) # 첫 번째 윈도우의 합
max_sum = window_sum
for i in range(k, len(arr)):
window_sum += arr[i] - arr[i - k] # 윈도우의 오른쪽으로 이동
max_sum = max(max_sum, window_sum)
return max_sum
def minSubArrayLen(S, arr):
l = 0
total = 0
min_len = float('inf')
for r in range(len(arr)):
total += arr[r] # 오른쪽 포인터로 윈도우 확장
while total >= S: # 합이 S 이상이면
min_len = min(min_len, r - l + 1) # 최소 길이 갱신
total -= arr[l] # 왼쪽 포인터 이동하여 윈도우 축소
l += 1
return min_len if min_len != float('inf') else 0
def lengthOfLongestSubstringKDistinct(s: str, k: int) -> int:
if k == 0: # K가 0이면 결과는 0
return 0
char_count = {} # 각 문자의 등장 횟수를 기록할 딕셔너리
l = 0 # 왼쪽 포인터
max_len = 0 # 최장 부분 문자열의 길이
for r in range(len(s)): # 오른쪽 포인터로 문자열 탐색
# 오른쪽 포인터에서 본 문자를 딕셔너리에 추가하거나 개수 증가
char_count[s[r]] = char_count.get(s[r], 0) + 1
# 딕셔너리의 길이가 K를 초과하면
while len(char_count) > k:
char_count[s[l]] -= 1 # 왼쪽 포인터가 가리키는 문자의 개수 감소
if char_count[s[l]] == 0: # 문자의 개수가 0이 되면 딕셔너리에서 제거
del char_count[s[l]]
l += 1 # 왼쪽 포인터 이동하여 윈도우 축소
# 현재 윈도우 크기와 최대 길이를 비교하여 갱신
max_len = max(max_len, r - l + 1)
return max_len
# 테스트
s = "eceba"
k = 2
print(lengthOfLongestSubstringKDistinct(s, k)) # 출력: 3