https://programmers.co.kr/learn/courses/30/lessons/67258#
set
을 활용해 전체 gems
의 종류를 찾고, 이를 활용해 초기화한 딕셔너리 gemdict
start
, end
: 범위 인덱스의 시작, 끝 값cnt
: 초기 end
의 값을 찾기 위한 변수end
값을 증가시킴end
가 끝에 도달할때까지, start
가 최대로 도달할 수 있을때까지 탐색def solution(gems):
total = set(gems)
gemdict = {key:0 for key in total} # 딕셔너리 초기화
cnt = len(total) # 모든 보석이 있는지 판단
length = len(gems) # gems 전체 길이
start, end = 0, 0 # 인덱스 시작, 끝
while cnt != 0: # 끝 인덱스가 처음으로 나타나는 지점 탐색
if not gemdict[gems[end]]:
cnt -= 1
gemdict[gems[end]] += 1
end += 1
end -= 1
tmp = [start, end] # 처음 정답 설정
while start <= end < length-1: # end가 끝에 도달할때까지 진행
if not cnt : # 보석이 다 있는 경우, start값 증가
if gemdict[gems[start]] == 1:
cnt += 1
gem = gems[start]
if tmp[1]-tmp[0] > end-start:
tmp = [start, end]
gemdict[gems[start]] -= 1
start += 1
else : # 보석이 없는 경우, end값 증가
end += 1
if gems[end] == gem :
cnt -= 1
if tmp[1]-tmp[0] > end-start :
tmp = [start, end]
gemdict[gems[end]] += 1
while start <= end: # start를 최대한 밀 수 있을 때까지 진행
if not cnt : # 보석이 있는 경우, start값 증가
if gemdict[gems[start]] == 1:
cnt += 1
if tmp[1]-tmp[0] > end-start:
tmp = [start, end]
gemdict[gems[start]] -= 1
start += 1
else : # 보석이 하나라도 없는 경우, 마침
break
# 인덱스의 시작값이 1임을 고려
tmp[0] += 1
tmp[1] += 1
return tmp
투포인터를 이용해 해결하는 문제였는데, 아직 투포인터가 익숙하지 않아서 쉽지 않았다.... 더 많은 노력이 필요하다!