처음에는 투포인터는 생각지도 못하고 슬라이싱으로 풀었음. 결과는 당연히 시간초과.
그래서 카카오 해설을 보고 투포인터 문제인걸 보고 투포인터 사용해서 구현
시작 보석의 위치인덱스를 s 마지막 보석의 위치 인덱스를 e라고 한뒤
딕셔너리를 사용해서 구현했다.
def solution(gems):
gemdict={}
for gem in gems:
gemdict[gem]=0
gemsort=len(gemdict.keys())
numofgem=0
anslist=[]
s,e=0,0
gemdict[gems[0]]=1
numofgem=1
try:
while e<len(gems):
if numofgem==gemsort:
anslist.append([s+1,e+1])
gemdict[gems[s]]-=1
if gemdict[gems[s]]==0:
numofgem-=1
s+=1
elif numofgem<gemsort or s>e :
e+=1
gemdict[gems[e]]+=1
if gemdict[gems[e]]==1:
numofgem+=1
except:
pass
anslist.sort(key=lambda x:(x[1]-x[0],x[0]))
return anslist[0]
통과는 하지만 코드간결화 및 예외처리 제거를 위해 chatgpt 에게 물어본결과
def solution(gems):
gemdict = {}
gemsort = len(set(gems))
numofgem = 0
anslist = []
s = e = 0
gemdict[gems[0]] = 1
numofgem = 1
while e < len(gems):
if numofgem == gemsort:
anslist.append([s+1, e+1])
gemdict[gems[s]] -= 1
if gemdict[gems[s]] == 0:
numofgem -= 1
s += 1
else:
e += 1
if e == len(gems):
break
gemdict[gems[e]] = gemdict.get(gems[e], 0) + 1
if gemdict[gems[e]] == 1:
numofgem += 1
anslist.sort(key=lambda x: (x[1]-x[0], x[0]))
return anslist[0]
1) gemdict.keys() 대신 set(gems)를 사용하여 고유한 보석 종류를 얻음
2) try-except 블록을 제거하고 while 루프 조건을 e < len(gems)로 변경. 이후 break을 통해 예외처리 제거
3) gemdict[gems[e]] += 1 대신 gemdict.get(gems[e], 0) + 1를 사용하여 딕셔너리 값에 접근. 이렇게 하면 초기에 키값이 없는 경우에도 접근 가능