https://school.programmers.co.kr/learn/courses/30/lessons/67258
코드
def solution(gems):
size = len(set(gems))
dic = {gems[0]:1}
temp = [0, len(gems) - 1]
start , end = 0, 0
while(start < len(gems) and end < len(gems)):
if len(dic) == size:
if end - start < temp[1] - temp[0]:
temp = [start, end]
if dic[gems[start]] == 1:
del dic[gems[start]]
else:
dic[gems[start]] -= 1
start += 1
else:
end += 1
if end == len(gems):
break
if gems[end] in dic.keys():
dic[gems[end]] += 1
else:
dic[gems[end]] = 1
return [temp[0]+1, temp[1]+1]
모든 종류의 보석을 1개 이상 포함하는 가장 짧은 구간을 구해야 하는 문제이다.
시간 복잡도를 고려해 슬라이싱 대신 투포인터와 딕셔너리를 이용하여 풀어야 한다.
처음에 포인터 start와 end를 모두 1번 진열대에 위치시키고, 보석의 종류가 모두 채워질 때까지 end를 증가시키면서 딕셔너리의 키와 값을 갱신한다. 종류가 모두 채워지면 가장 짧은 구간인지 구하기 위해 start를 증가시키며 비교한다.
'코딩테스트 > programmers (python)' 카테고리의 다른 글
Programmers / 3단계 / 징검다리 건너기 / python / 2019 카카오 개발자 겨울 인턴십 (0) | 2024.05.24 |
---|---|
Programmers / 2단계 / 방금그곡 / python / 2018 KAKAO BLIND RECRUITMENT (0) | 2024.05.22 |
Programmers / 2단계 / 여행 경로 / python (0) | 2024.05.19 |
Programmers / 2단계 / 줄 서는 방법 / python (0) | 2024.05.16 |
Programmers / 2단계 / 미로 탈출 / python (0) | 2024.05.14 |