문제
https://school.programmers.co.kr/learn/courses/30/lessons/67258
|
|
풀이
전략
첫번째 원소일때 결과값 [start, end]
~ 마지막 원소의 [start, end]
를 구해서 start - end
의 길이가 최소값
을 리턴하면 될 수 있지만 gems의 배열이 10만개 까지므로 O(N^2) 가 되면 효율성에서 탈락할 수 있다
. 최대한 안에 끝내는 방법을 생각해야한다. 따라서 완전탐색보단 Greedy한 방법을 고려해야한다.
풀이
- 총 사야하는 보석 종류
target
선언. set으로 중복을 제거해줄 수 있다. - answer의 최대값은
[0, 보석의 총 갯수]
이다. deafultdict
를 이용하여 보석의 갯수를 닮은pocket
을 선언한다. 딕셔너리에 키값이 처음 입력될 때 0으로 초기화 할 수 있다.start
와end
를 선언해서 커서역활을 한다.
내 주머니(pocket)에 모든 종류의 보석이 다 차면 start
포인터를 한칸씩 앞으로 가게 하여 최소한의 길이를 구하여 answer
에 넣어놓으면 된다. 만약 보석이 다 차지 않으면 end
를 하나씩 증가해서 모든 종류의 보석이 다찰때 까지 end를 증가
시킨다.
solution.py
|
|
다른사람풀이
더 낮은 시간복잡도를 갖고있는 풀이.
solution.py
|
|