이 영역을 누르면 첫 페이지로 이동
자라자 블로그의 첫 페이지로 이동

자라자

페이지 맨 위로 올라가기

자라자

개발자를 준비하는 자라자의 블로그입니다.

[프로그래머스] 보석 쇼핑 파이썬 풀이

  • 2021.12.09 12:56
  • PS/Programmers

프로그래머스로고

[문제 링크]

https://programmers.co.kr/learn/courses/30/lessons/67258

[입출력 예]

gems result
["DIA", "RUBY", "RUBY", "DIA", "DIA", "EMERALD", "SAPPHIRE", "DIA"] [3, 7]
["AA", "AB", "AC", "AA", "AC"] [1, 3]
["XYZ", "XYZ", "XYZ"] [1, 1]
["ZZZ", "YYY", "NNNN", "YYY", "BBB"] [1, 5]

[1차시도 테스트케이스 4/4 제출 15.6]

def solution(gems):
    answer=[]
    start,end=0,0
    set_gem=set(gems)
    while end!=len(gems)-1:
        while len(set(gems[start:end+1]))<len(set_gem) and end<len(gems)-1:
            end+=1
        while not len(set(gems[start:end+1]))<len(set_gem) and start<len(gems)-1:
            start+=1
        print(start-1,end)
        if (len(set(gems[start-1:end+1]))==len(set_gem)):
            answer.append([start,end+1])
    print(answer)
    return(answer[0])

[2차시도 정확성 통과]

# 전체 길이가 1일 경우 append가 안일어나서
# 1차시도에서 인덱스 에러가 발생
# 그리고 무조건 첫값을 보내는 게 아니라 정렬을 해줘야 함.
# 해당 풀이의 문제점은... 슬라이싱을 계속한다는 것이다.
# 슬라이싱이 빠른 연산은 맞지만 O(b-a)로 요소 개수만큼 시간 소요
# 따라서 슬라이싱으로 조회를 해보는 게 아니라, 딕셔너리에 담아두고 관리를 해야 한다...
def solution(gems):
    answer=[]
    start,end=0,0
    set_gem=set(gems)
    while end<len(gems)-1:
        while len(set(gems[start:end+1]))<len(set_gem) and end<len(gems)-1:
            end+=1
        while not len(set(gems[start:end+1]))<len(set_gem) and start<=end:
            start+=1

        if (len(set(gems[start-1:end+1]))==len(set_gem)):
            answer.append([start,end+1])
    if answer:
        return sorted(answer, key =lambda x: x[1]-x[0])[0]
    else:
        return [1,1]

[정답코드]

from collections import defaultdict
def solution(gems):
    start,end=0,len(gems)-1
    left,right=0,0
    dic = defaultdict(int)
    kind = len(set(gems))

    while right<len(gems):
        while len(dic) < kind and right<len(gems):
            dic[gems[right]]+=1 # 여기서 처음에 그냥 right 해서 애먹음
            right+=1
        while len(dic)==kind and left<=right:
            dic[gems[left]]-=1
            if (dic[gems[left]])==0:
                del(dic[gems[left]])
            left+=1
        # right 과 left의 업데이트를 조건문 보다 나중에 써줬기 때문에
        # 실제 만족하는 인덱스는 right-1, left-1이 된다.
        if end-start> right - left:
            start=left-1
            end=right-1
    return[start+1,end+1]

'PS > Programmers' 카테고리의 다른 글

[프로그래머스] 불량사용자 파이썬 풀이  (0) 2021.12.10
[프로그래머스] 셔틀버스  (0) 2021.12.08
[프로그래머스] 자물쇠와 열쇠 파이썬  (0) 2021.11.28
[프로그래머스] 순위  (0) 2021.11.27
[프로그래머스] 네트워크 파이썬  (0) 2021.11.27

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [프로그래머스] 불량사용자 파이썬 풀이

    [프로그래머스] 불량사용자 파이썬 풀이

    2021.12.10
  • [프로그래머스] 셔틀버스

    [프로그래머스] 셔틀버스

    2021.12.08
  • [프로그래머스] 자물쇠와 열쇠 파이썬

    [프로그래머스] 자물쇠와 열쇠 파이썬

    2021.11.28
  • [프로그래머스] 순위

    [프로그래머스] 순위

    2021.11.27
다른 글 더 둘러보기

정보

자라자 블로그의 첫 페이지로 이동

자라자

  • 자라자의 첫 페이지로 이동

검색

메뉴

  • 🏠 HOME
  • 💡 ABOUT
  • 💻 GITHUB

카테고리

  • 분류 전체보기 (91)
    • Tech Note (3)
    • Dev Log (11)
    • Study Log (11)
    • Settings (3)
    • PS (53)
      • Programmers (21)
      • BOJ (32)
    • Diary (10)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • ㅣ
  • 리액트
  • 공식문서읽기

나의 외부 링크

정보

자라자의 자라자

자라자

자라자

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © 자라자. Designed by Fraccino.

티스토리툴바