본문 바로가기
알고리즘

Python - 보석 쇼핑 (투 포인터)

by jun.s.gi 2023. 6. 10.
728x90

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

1. 두 개의 포인터가 토끼와 거북이처럼 같은 시작점에서 출발합니다.

 i 보석이 현재 Temp딕셔너리에 없으면 추가하고 있으면 하나 더합니다. (ed 포인터 +1)

 ii. Temp딕셔너리에 모든 보석이 담겼으면

    1) 정답을 최솟값으로 갱신

    2) st 포인터에 있는 보석의 개수가 1개라면 그 보석은 딕셔너리에서 지웁니다.(pop)

    3) 보석의 개수가 2개 이상이라면 1개 뺍니다. ( Temp[gems[st]] -= 1)

def solution(gems):
    answer = [100001, 999999]
    checkGems = len(set(gems))
    tempGems = {}
    st = 0
    ed = 0

    while st <= ed:
        if len(tempGems) != checkGems:
            if ed == len(gems): break
            
            if gems[ed] in tempGems:
                tempGems[gems[ed]] += 1
            else:
                tempGems[gems[ed]] = 1
            ed += 1
        else:   
            if answer[1] - answer[0] > (ed) - (st + 1) or (answer[1] - answer[0] == (ed) - (st + 1) and answer[0] > st + 1):
                answer[0] = st + 1
                answer[1] = ed
                
            if tempGems[gems[st]] > 1:
                tempGems[gems[st]] -= 1
            else:
                tempGems.pop(gems[st])
            st += 1

    return answer
728x90