투포인터를 사용하자. right 값을 하나씩 늘려가며 left을 줄여보자!
처음에 right를 먼저 줄인다음에 left를 줄이니 아래 테스트 케이스 불통이였다. (오답: [1, 4])
gems = ["DIA", "EM", "EM", "RUB", "DIA"] # 답 [3,5]
- 현재가지고 있는 보석을 담는 gdict를 생성한다.
- 보석 종류 수 gnum을 구한다.
- left = right = 0 를 시작으로 right를 하나씩 늘리며 보석을 추가한다.
- 보석종류를 다 갖췄을 때(len(gdict) == gnum) left에 있는 보석이 중복이라면 없애준다.
- answer 최소값을 update해준다.
from collections import defaultdict
def solution(gems):
gdict = defaultdict(int)
gnum = len(set(gems))
left = 0
right = 0
answer = [0, len(gems)]
while right < len(gems):
gdict[gems[right]] += 1
right += 1
if len(gdict) == gnum:
while left < right:
if gdict[gems[left]] <= 1:
break
gdict[gems[left]] -= 1
left += 1
if answer[1]+1-answer[0] > right - left:
answer = [left+1, right]
return answer
'개발 > 알고리즘' 카테고리의 다른 글
[백준 2493] 탑 (python) (0) | 2021.05.01 |
---|---|
[프로그래머스] 경주로 건설 (python) (0) | 2021.05.01 |
[백준 5557] 1학년 (python) (0) | 2021.04.29 |
[백준 1256] 사전 (python) (1) | 2021.04.29 |
[백준 4358] 생태학 (python) (0) | 2021.04.28 |
최근댓글