코딩테스트 연습 - 보석 쇼핑

["DIA", "RUBY", "RUBY", "DIA", "DIA", "EMERALD", "SAPPHIRE", "DIA"] [3, 7]

programmers.co.kr


 

투포인터를 사용하자. right 값을 하나씩 늘려가며 left을 줄여보자!

처음에 right를 먼저 줄인다음에 left를 줄이니 아래 테스트 케이스 불통이였다. (오답: [1, 4])

gems = ["DIA", "EM", "EM", "RUB", "DIA"] # 답 [3,5]

 

  1. 현재가지고 있는 보석을 담는 gdict를 생성한다.
  2. 보석 종류 수 gnum을 구한다.
  3. left = right = 0 를 시작으로 right를 하나씩 늘리며 보석을 추가한다.
  4. 보석종류를 다 갖췄을 때(len(gdict) == gnum) left에 있는 보석이 중복이라면 없애준다.
  5. answer 최소값을 update해준다.

 

from collections import defaultdict


def solution(gems):
    gdict = defaultdict(int)
    gnum = len(set(gems))

    left = 0
    right = 0
    answer = [0, len(gems)]
    while right < len(gems):
        gdict[gems[right]] += 1
        right += 1

        if len(gdict) == gnum:
            while left < right:
                if gdict[gems[left]] <= 1:
                    break
                gdict[gems[left]] -= 1
                left += 1

            if answer[1]+1-answer[0] > right - left:
                answer = [left+1, right]

    return answer

 

'개발 > 알고리즘' 카테고리의 다른 글

[백준 2493] 탑 (python)  (0) 2021.05.01
[프로그래머스] 경주로 건설 (python)  (0) 2021.05.01
[백준 5557] 1학년 (python)  (0) 2021.04.29
[백준 1256] 사전 (python)  (1) 2021.04.29
[백준 4358] 생태학 (python)  (0) 2021.04.28
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기