힙큐

    [python] 백준 - 2014. 소수의 곱

    [python] 백준 - 2014. 소수의 곱

    🤔문제 해결 G2 | 수학, 우선순위 큐 DP로 구해보려고 했지만 역시 아니었다. 2**31 길이의 배열은 좀 아닌거 같다. 어려워서 알고리즘 분류를 보니 우선순위 큐로 해결하는 문제였다. 우선순위큐는 큐 안에 있는 값들 중 최소 값을 반환할 수 있다. 파이썬에서는 힙큐를 불러와서 사용하고 힙큐는 최소힙 기반으로 되어있다. 해결방법은 최초 힙큐에 주어진 소수를 넣는다. 힙큐에서 숫자를 하나씩 꺼내면서 주어진 소수들을 곱해서 힙큐에 넣는다. (이 때 꺼내는 횟수가 소수의 곱들 중에서 N번째 수이다) 하지만 이렇게 되면 중복이 발생한다. ( 2*3 이나 3*2 ) 3*2는 되지만 2*3은 안된다는 식으로 힙큐에서 꺼낸 수가 소수로 나누어 떨어지면 그 다음 소수는 건너뛴다. 결과는 아래와 같다 💻소스 코드 i..

    [python] 백준 - 1655. 가운데를 말해요

    [python] 백준 - 1655. 가운데를 말해요

    🤔문제 해결 G2 | 우선순위 큐 처음에는 가볍게 정렬로 풀었지만, 시간초과가 발생했다. ( 바이너리서치는 통과 된다고 함 ) 가운데 값 구하기를 열심히 찾아봤지만 없었다. 어쩔 수 없다. 이 문제의 의도는 우선순위 큐를 활용하는 것이다. 파이썬의 힙큐 모듈을 사용하면 되는데, 최소힙 기준으로 되어있다. 최소힙은 가장 작은 원소가 루트에 위치하는 것이다. 우리는 가운데 값을 찾아야 하기 때문에 힙을 두개 만들어서 왼쪽의 가장 큰 수와 오른쪽의 가장 작은 수를 비교하여 가운데 값을 구할 것이다. 이렇게 두 부분으로 나누면 가운데 값을 구 할 수 있다. 하지만!!!!!!!!!!! 최소힙으로 힙큐 모듈이 구성되어 있으므로, 왼쪽의 구성은 음수를 붙여서 거꾸로 만들어야한다. 이렇게 하면 왼쪽의 0번과 오른쪽의 ..

    [python] 백준 - 11279. 최대 힙

    [python] 백준 - 11279. 최대 힙

    🤔문제 해결 S2 | 자료구조, 우선순위 큐 최대힙 자료구조를 활용하는 문제 하지만 귀찮으므로 힙큐 모듈을 사용했다. 💻소스 코드 import sys import heapq N = int(input()) numbers = [] for i in range(N): number = int(sys.stdin.readline()) if number: heapq.heappush(numbers, -number) else: if numbers: print(abs(heapq.heappop(numbers))) else: print(0) 📕문제 확인 출처: BACKJOON ONLINE JUDGE 링크: https://www.acmicpc.net/problem/11279 11279번: 최대 힙 첫째 줄에 연산의 개수 N(1≤..

    [python] 프로그래머스 - 무지의 먹방 라이브(2019 KAKAO BLIND RECRUITMENT)

    [python] 프로그래머스 - 무지의 먹방 라이브(2019 KAKAO BLIND RECRUITMENT)

    🤔문제 해결 Lv4 | 우선순위 큐? 가장 처음 생각난건 역시 1초씩 전부 돌아보자!! 하지만 역시나 시간초과 발생 😂🤣 음식을 한꺼번에 뺄순 없을까 생각해서 가장 적은 음식의 수만큼 사이클을 돌기로 했다. 예를 들어 음식이 [ 5,5,3,3,6 ] 이라면 3만큼 한꺼번에 돌아주는 것이다. 음식이 3만큼 있고, 전체 길이가 5 이므로, 15초 뒤에는 [ 2,2,0,0,3 ] 이 된다고 상상만!!! 직접 빼주고 하면 시간 초과 다음은 2만큼 있고, 전체 길이가 3 이므로 (0은 취급 안함), 6 초 뒤에는 [ 0,0,0,0,1 ] 역시 상상만 하자 위의 방법 처럼 한꺼번에 빼주는데 가장 적은 음식은 어떻게 꺼내냐하면 바로 힙큐를 쓰자. 힙큐에 음식의 양과 해당 음식의 번호를 차례로 넣으면 가장 작은 음식을..

    [python] 프로그래머스 - 야근 지수

    [python] 프로그래머스 - 야근 지수

    🤔문제 해결 Lv3 가장 큰 값을 조금 씩 줄여나가야 하는 문제! - 우선순위 큐를 이용했다. 우선순위 큐는 리스트에서 pop()을 하게 되면 가장 작은 값이 나오게 된다. 여기서는 가장 큰 값을 꺼내야 하므로 각각의 값을 음수로 힙큐에 넣어 줬다. 가장 작은 값(사실은 가장 큰 값)을 꺼내서 1씩 더해준다. 그리고 다시 힙큐에 넣어준다. 테스트 케이스 1번을 풀이 해 보자. 4, [4, 3, 3] 위 그림의 첫째줄은 처음 힙큐에 넣었을 때이다. 다음 줄부터는 1시간씩 지날 때 마다의 힙큐의 상황이다. -4가 제일 작으므로 -4를 꺼내서 1을 더해주고 다시 넣는다. -3을 꺼내서 1을 더해주고 다시 넣는다. 또 -3을 꺼내서 1을 더해주고 다시 넣는다. 마지막으로 -3을 꺼내서 1을 더해주고 다시 넣는다..

    [python] heapq(힙큐, 우선순위큐)

    [python] heapq(힙큐, 우선순위큐)

    📗heapq란? 간단하게 리스트내에서 가장 작은 값이 맨처음위치(인덱스 0)애 오게 해주는 내장 모듈 우선순위 큐라고 알면 쉽다. 🔵 시작하기 import heapq 🔵 선언하기 보통 리스트를 선언하는 것처럼 만든다. heap_list = [] 🔵 원소 추가하기 ( heapq.heappush(리스트, 값 )) - 아래 보이는 것 처럼 가장 작은 값이 맨 처음 위치에 왔다. 시간복잡도 O(logn) heapq.heappush(heap_list, 5) heapq.heappush(heap_list, 10) heapq.heappush(heap_list, 99) heapq.heappush(heap_list, 2) print(heap_list) # [2, 5, 99, 10] 🔵 원소 삭제하기 ( heapq.heap..