[프로그래머스lv3] [2020 카카오 인턴십] 보석 쇼핑

2021. 5. 4. 12:29·알고리즘 문제풀이

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

 

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

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

programmers.co.kr


풀이

 

gems에서 보석을 차례대로 반복문에 넣는다.

 

큐에 차례때로 보석을 넣어준다.

 

또한 보석의 수를 효율적으로 계산하기 위해 dict를 따로 만들어 요소의 수를 기록한다.

 

set을 통해 큐에 모든 보석이 들어갔는지 확인한다.

 

모든 요소가 들어갔다면

 

  • 현재 상태를 저장한다. 나중에 답 비교를 위해 우선순위 큐에 [큐길이, 시작위치] 로 저장한다.
  • 큐의 첫번째 보석의 수가 2 이상이라면 현재 큐를 한 번 pop를 해주고 해당 보석의 수를 dict에서 -1해준다.
  • 남은 큐의 상태를 같은 형식으로 우선순위 큐에 저장한다.
  • q의 첫번째 단어의 count를 다시 확인하며 위 과정을 반복한다.
  • 첫 번째 단어의 count가 다시 1이 되었다면 종료하고 다시 for문으로 돌아온다.

위 과정을 거치면 우선순위 큐의 첫번째 요소에 가장 작은 큐길이 중 가장 작은 시작위치를 가진게 위치한다.(heapq 모듈은 최소힙이기 때문)

 

나는 큐로 삽입과 삭제를 통해 보석수를 카운트하고 시작위치와 길이를 계산했지만

카카오 풀이를 보면 투포인터를 이용했다. 투 포인터 풀이가 훨씬 깔끔하다.

 


시간복잡도

 

보석의 수가 N이라면 for문에서 N번 호출하기 때문에 O(N) 이다.

 

for문안에서 while문이 존재하지만 while문은 N개의 큐 중복없이 삭제,삽입 하기 때문에 총 횟수가 N번을 넘지 않는다. 따라서 O(N)을 넘지 않는다.

 

for문 안에서 우선순위 큐 연산이 매번 일어난다. 우선순위 큐의 삽입과 삭제는 O(logN)이다.

 

따라서 O(N) * O(logN) => O(Nlog(N)) 이라고 볼 수 있다.

 


코드

from collections import defaultdict,deque
import heapq

def solution(gems):
    gem_set,now_set = set(gems), set()
    gem_dict = defaultdict(int)
    pq = []
    q = deque([])
    for i,gem in enumerate(gems):
        now_set.add(gem)
        gem_dict[gem]+=1
        q.append((i+1,gem))

        if len(now_set) == len(gem_set): # q에 모든 요소가 있다
            idx = q[0][0]
            l = len(q)
            heapq.heappush(pq,[l,idx])

            while gem_dict.get(q[0][1]) >= 2: # q의 첫번째 요소가 q안에 2개 이상이라면 while 문 진행
                idx,g = q.popleft()
                l = len(q)
                heapq.heappush(pq,[l,idx+1])
                gem_dict[g] -= 1

    l,s = heapq.heappop(pq)

    return [s,s+l-1]

 

 

'알고리즘 문제풀이' 카테고리의 다른 글

[백준3980] 선발 명단  (0) 2021.05.05
[프로그래머스lv.3] 정수 삼각형  (0) 2021.05.04
[프로그래머스lv.3] 순위  (0) 2021.05.04
[프로그래머스.lv3] 입국심사  (0) 2021.05.03
[백준2262] 토너먼트 만들기  (0) 2021.05.03
'알고리즘 문제풀이' 카테고리의 다른 글
  • [백준3980] 선발 명단
  • [프로그래머스lv.3] 정수 삼각형
  • [프로그래머스lv.3] 순위
  • [프로그래머스.lv3] 입국심사
WildDevmon
WildDevmon
『앗! 야생의 개발몬(이)가 나타났다!』
  • WildDevmon
    야생의 개발몬
    WildDevmon
  • 전체
    오늘
    어제
    • 분류 전체보기 (35)
      • Server (5)
      • 알고리즘 문제풀이 (27)
      • 회고 (3)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준 1027
    백준 램프
    자바 최소공배수
    자바 프로세스 종료
    백준 경쟁적 전염
    경력 서류
    자바 스레드 상태
    통나무 자르기
    preStop
    백준 5347
    자바 최대공약수
    direct buffer
    네이티브 메모리
    백준 17281
    백준 파티
    컴공 취준
    합승 택시 요금
    백준15954
    백준 18405
    소가 길을 건너간 이유 5
    1114백준
    백준 1034
    백준 10610
    백준1747
    선발 명단
    우아한 종료
    코틀린 코루틴
    백준6980
    백준 1114
    백준14465
    백준 30
    백준 1004
    백준1188
    terminationGracePeriodSeconds
    백준1238
    백준2262
    다이렉트 버퍼
    자바 물리 메모리
    graceful shutdown
    네카라쿠배 취업
    소수&팰린드롬
    카카오 필요스펙
    백준 인형들
    파이썬
    커널 스레드 상태
    ai개발자
    백준 어린 왕자
    백준 고층 건물
    2020 카카오 인턴
    백준 1114 파이썬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
WildDevmon
[프로그래머스lv3] [2020 카카오 인턴십] 보석 쇼핑
상단으로

티스토리툴바