프로그래머스 / 보석 쇼핑 / python

맹민재·2023년 6월 14일
0

알고리즘

목록 보기
105/134

첫시도

def solution(gems):
    def dfs(start, idx):
        if idx == len(gems):
            return [0, len(gems)]
        for i in gem_dict:
            if gem_dict[i] == 0:
                break
        else:
            return [start, idx]
        
        gem_dict[gems[idx]] += 1
        return dfs(start, idx+1)
            
    answer = [0,len(gems)]
    gem = set(gems)
    gem_dict = dict()
    
    c_flag = False
    for i in range(len(gems)-len(gem)):
        for g in gem:
            gem_dict[g] = 0
        gem_dict[gems[i]] += 1
        start, end = dfs(i, i+1)
        start += 1
        if answer[1] - answer[0] > end - start:
            answer = [start, end]
    
    return answer

테스트 케이스는 넘어갔지만
제출에서 처참한 결과가 나왔다.

정확성도 맞지 않을 뿐더러 효율적이지도 않다고한다.....
gems 배열 크기가 최대 100,000 이므로 위 코드의 시간 복잡도인 nO(logn)으로 해결 가능하다고 생각했는데 히든 케이스는 더 큰 크기의 리스트가 주어지는 듯 하다.

def solution(gems):
    gems = gems + [" "]
    answer = [1,len(gems)]
    l = len(set(gems))-1
    gem_dict = dict()
    start = end = 0
    
    while start < len(gems) and end < len(gems):
        if len(gem_dict) < l:
            if gems[end] in gem_dict:
                gem_dict[gems[end]] += 1
            else:
                gem_dict[gems[end]] = 1
            end += 1
        else:
            if end - start < answer[1] - answer[0] + 1:
                answer = [start+1, end]
            
            gem_dict[gems[start]] -= 1
            if gem_dict[gems[start]] == 0:
                del gem_dict[gems[start]]
            start += 1
            
    return answer

투 포인터 알고리즘으로 해결 가능한 문제

보석 정보를 딕셔너리에 저장한다. 딕셔너리의 크기가 보석의 수와 같아질 때까지 end를 1 씩 증가시킨다. 같아지면 딕셔너리 정보를 수정해나가면서 start를 1씩 증가시킨다.


백준에서 투 포인트 알고리즘을 공부 한 후 접한 문제지만 투 포인트 알고리즘을 적용시킬 생각을 전혀 하지 못했다.....
아직 경험이 많이 부족하다고 느낀 문제였다.

참고한 사이트 >https://velog.io/@sem/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-LEVEL3-%EB%B3%B4%EC%84%9D-%EC%87%BC%ED%95%91-Python

profile
ㄱH ㅂrㄹ ㅈr

0개의 댓글