[Programmers][Python]보석 쇼핑
https://programmers.co.kr/learn/courses/30/lessons/67258#
📌풀이
내가 쓴 풀이(성공)
- 투포인터 활용
set
을 활용해 전체gems
의 종류를 찾고, 이를 활용해 초기화한 딕셔너리gemdict
start
,end
: 범위 인덱스의 시작, 끝 값cnt
: 초기end
의 값을 찾기 위한 변수- 모든 보석이 1개 이상 생길때까지
end
값을 증가시킴 - 모든 보석을 찾게 되면, 0을 가짐
- 하나라도 없는 보석이 있으면 0이 아닌 값을 가짐
- 모든 보석이 1개 이상 생길때까지
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
📌후기
투포인터를 이용해 해결하는 문제였는데, 아직 투포인터가 익숙하지 않아서 쉽지 않았다.... 더 많은 노력이 필요하다!
Author And Source
이 문제에 관하여([Programmers][Python]보석 쇼핑), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@mein-figur/ProgrammersPython보석-쇼핑저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)