보물창고 블로그

2020 카카오 인턴십 보석 쇼핑 풀이 With Python 본문

알고리즘 풀이/프로그래머스

2020 카카오 인턴십 보석 쇼핑 풀이 With Python

홋 메 2020. 7. 6. 21:16
728x90

문제 링크: https://programmers.co.kr/learn/courses/30/lessons/67258

 

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

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

programmers.co.kr

실제 시험에서 이 문제를 풀지 못하였습니다. 프로그래머스에서 복원된 문제를 다시 풀었는데, 다시 푸니 의외로 생각했던 것보다 쉬운 문제였습니다. 어렵다고 생각하니 어렵게 느껴진 것 같습니다. 모든 것은 마음먹기에 달린 것 같습니다.

문제를 해결한 방법은 start와 end 변수를 두어, 처음에 모두 0으로 초기화시키고, end를 늘리면서 dict 자료구조에 보석의 수를 카운트합니다. 만약 전체 보석수와 dict 보석 종류의 수가 같다면, start를 1씩 증가시키면서 가장 작은 길이를 찾습니다. 파이썬은 인덱스가 0부터 시작하므로 마지막에 start와 end에 1씩 더해줍니다. 소스코드는 아래와 같습니다. 

def solution(gems):
    n = len(set(gems))
    answer = [0, len(gems) - 1]
    start = 0
    end = 0
    dic1 = {gems[0]: 1}
    while start < len(gems) and end < len(gems):
        if len(dic1) == n:
            if answer[1] - answer[0] > end - start:
                answer[0] = start
                answer[1] = end
            if dic1[gems[start]] == 1:
                del dic1[gems[start]]
            else:
                dic1[gems[start]] -= 1
            start += 1
        else:
            end += 1
            if end == len(gems):
                break
            else:
                if dic1.get(gems[end]) is None:
                    dic1[gems[end]] = 1
                else:
                    dic1[gems[end]] += 1
    answer[0] += 1
    answer[1] += 1
    return answer

소스코드에 대한 질문이 있으신 경우 댓글 남겨주시면 답변드리겠습니다. 읽어주셔서 감사합니다. :-)

Comments