300x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- nlp
- 프로그래머스
- 네트워크
- 킥스타트
- 코딩테스트
- AI
- 동적 프로그래밍
- DFS
- 프로그래밍
- dp
- 그래프
- 구글 킥스타트
- PYTHON
- CSS
- 리눅스
- 브루트포스
- 알고리즘
- 백준
- 코딩
- 운영체제
- 순열
- google coding competition
- 코딩 테스트
- 딥러닝
- linux
- kick start
- OS
- BFS
- 파이썬
- 동적프로그래밍
Archives
- Today
- Total
오뚝이개발자
보석 쇼핑 본문
728x90
300x250
문제
https://programmers.co.kr/learn/courses/30/lessons/67258
나의 풀이
처음엔 그냥 2중 for문을 써서 각 시작점마다 보석 종류를 모두 포함하는 끝지점을 검출하면 break하고 다음 시작점부터 탐색하는 알고리즘을 짰는데 역시나 시간초과에 걸렸다. 개선한 풀이는 다음과 같다.
- start, end의 투포인터를 사용한다. 처음엔 둘다 0번째 인덱스로 초기화 한다.
- start부터 end까지의 보석이 전체 보석 종류를 포함하면 start를 증가시키고, 모자라면 end를 증가시킨다.
- 포인터를 증가시키면서 전체 보석을 포함하는지의 여부는 dictionary로 파악한다. (start를 증가시켜야하면 dic[start] -= 1해주고 end를 증가시켜야하면 dic[end] += 1 해준다. 즉, dictionary는 해당 범위의 보석들의 빈도수이다.)
- 이 때, dic[i]==0이면 해당 key i를 dic에서 del 해주어야 한다.
코드
def solution(gems):
size = len(set(gems))
dic = {gems[0]:1}
temp = [0, len(gems) - 1] #답이 될 수 있는 후보
start , end = 0, 0
while(start < len(gems) and end < len(gems)):
if len(dic) == size:
if end - start < temp[1] - temp[0]:
temp = [start, end]
if dic[gems[start]] == 1:
del dic[gems[start]]
else:
dic[gems[start]] -= 1
start += 1
else:
end += 1
if end == len(gems):
break
if gems[end] in dic.keys():
dic[gems[end]] += 1
else:
dic[gems[end]] = 1
return [temp[0]+1, temp[1]+1]
728x90
300x250
Comments