[프로그래머스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]

 

 

'알고리즘 문제풀이 > 프로그래머스' 카테고리의 다른 글

[2018 KAKAO BLIND RECRUITMENT] 셔틀버스  (0) 2021.05.08
[2019 카카오 개발자 겨울 인턴십] 불량 사용자  (0) 2021.05.05
[프로그래머스lv.3] 정수 삼각형  (0) 2021.05.04
[프로그래머스lv.3] 순위  (0) 2021.05.04
[프로그래머스.lv3] 입국심사  (0) 2021.05.03
'알고리즘 문제풀이/프로그래머스' 카테고리의 다른 글
  • [2019 카카오 개발자 겨울 인턴십] 불량 사용자
  • [프로그래머스lv.3] 정수 삼각형
  • [프로그래머스lv.3] 순위
  • [프로그래머스.lv3] 입국심사
check-mate
check-mate
모두 화이팅
  • check-mate
    야생의 개발몬
    check-mate
  • 전체
    오늘
    어제
    • 분류 전체보기 (33) N
      • Server (0)
        • Spring Boot (1)
      • Computer Science (0)
        • 운영체제 (0)
        • 기타 (0)
        • 객체지향 (0)
        • 클린코드 (0)
      • Language (1) N
        • JAVA (1) N
      • 알고리즘 문제풀이 (27)
        • 백준 (20)
        • 프로그래머스 (7)
      • 기타 (4)
        • 회고 (3)
        • 대외활동 (1)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    이펙티브 자바 아이템 57
    이펙티브 자바 아이템 51
    스프링과 스프링부트 차이
    카카오 필요스펙
    FeignClient
    자바 원시타입
    ai개발자
    이펙티브 자바 아이템 56
    이펙티브자바 아이템 78
    클린코드 4장
    스프링 AOP
    이펙티브 자바 아이템 49
    세마포어 뮤텍스 차이
    FeignClient 디코더
    filter vs interceptor
    이펙티브 자바 아이템 84
    이펙티브자바 아이템64
    이펙티브 자바 아이템 55
    원시타입 장점
    운영체제
    오브젝트 1장
    클린코드 5장
    오브젝트 7장
    오브젝트 12장
    오브젝트 9장
    오브젝트 3장
    이펙티브 자바 아이템 52
    클린코드 9장
    네카라쿠배 취업
    AOP
    direct buffer
    다이렉트 버퍼
    이펙티브 자바 아이템53
    DecodeException
    native memory
    이펙티브 자바 아이템 90
    SpringBootApplication
    Feign
    이펙티브 자바 아이템 58
    프로세스
    오브젝트 8장
    경력 서류
    이펙티브 자바 아이템54
    메일 시스템
    파이썬
    이펙티브 자바 아이템 89
    ResponseEntityDecoder
    네이티브 메모리
    jvm
    컴공 취준
  • 최근 댓글

  • 최근 글

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

티스토리툴바