https://programmers.co.kr/learn/courses/30/lessons/67258
개인적으로 좀 어려웠다. 구현능력이 많이 부족한 것 같다. 나중에 다시 한번 풀어봐야겠다.
처음에 내가 문제에 접근할 때 슬라이딩 윈도우로 오른쪽으로 밀면서 최소의 크기를 구하려 했는데, 찾아보니 두 포인터라는 알고리즘이 있었다.
카카오 공식 페이지에서 제공한 풀이를 살펴보았다.
https://tech.kakao.com/2020/07/01/2020-internship-test/
딕셔너리를 이용해 빈도수를 정의하여서, 범위 내에 모든 종류의 보석이 들어가는지 확인할 수 있었다.
나도 위에와 같이 오른쪽을 늘리면서 크기가 보석의 종류와 같아졌을때, 왼쪽을 줄여나가는 방법을 생각했지만, 왼쪽을 줄여나가다 안되는경우 오른쪽을 증가시킨다는 생각을 떠올리지 못했다.
구현된 코드를 보고 이해하는 것은 쉬운데, 막상 이걸 머리속으로 생각을 해도 구현해내는 능력이 부족하다고 생각했다.
생각해낸 알고리즘의 종료조건, 분기조건을 만들어서 문제를 해결해야 한다고 생각한 문제
def solution(gems):
answer = []
size = len(set(gems))
d = {gems[0]:1}
q = [0, len(gems) - 1]
start = 0
end = 0
while(start < len(gems) and end < len(gems)):
if len(d) == size:
if end - start < q[1] - q[0]:
q = [start, end]
if d[gems[start]] == 1:
del d[gems[start]]
else:
d[gems[start]] -= 1
start += 1
else:
end += 1
if end == len(gems):
break
if gems[end] in d.keys():
d[gems[end]] += 1
else:
d[gems[end]] = 1
print(q)
return [q[0]+1, q[1]+1]