프로그래머스 레벨 3 [카카오 인턴] 보석 쇼핑

yjkim·2023년 6월 10일
0

알고리즘

목록 보기
13/60

문제:https://school.programmers.co.kr/learn/courses/30/lessons/67258

접근

처음에는 투포인터는 생각지도 못하고 슬라이싱으로 풀었음. 결과는 당연히 시간초과.
그래서 카카오 해설을 보고 투포인터 문제인걸 보고 투포인터 사용해서 구현
시작 보석의 위치인덱스를 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를 사용하여 딕셔너리 값에 접근. 이렇게 하면 초기에 키값이 없는 경우에도 접근 가능

profile
We may throw the dice, but the Lord determines how they fall

0개의 댓글