Python

    [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..

    [python] 백준 - 1495. 기타리스트

    [python] 백준 - 1495. 기타리스트

    🤔문제 해결 1. S1 | 다이나믹프로그래밍 2. 각각의 연주 차례에 가능한 볼륨을 저장하기 위해 2차원 리스트를 만든다. 3. 리스트를 설명하자면 맨 첫줄(i = 0)은 연주 시작전 단계이고 값이 0이 아니라 1인 부분은 내가 가지고 있는 볼륨이다. 현재 테스트케이스 예시(S=5)로 작성됐으므로 [0][5] = 1 이다. 4. 테스트케이스: 시작값 5, 최대값 10, 연주리스트 = [5, 3, 7] 5. 첫번째 연주를 하기 전에 볼륨을 바꾼다. 현재 볼륨은 5, 첫번째 연주 볼륨은 5 이므로 5+5 = 10, 5-5 = 0 으로 둘다 0보다 크고 10보다 작으므로 아래와 같이 저장할 수 있다. 6. 첫번째 연주를 하기 전에 볼륨을 바꾼다. 첫번째와 다른점은 현재 볼륨이 2가지(0과 10)이다. 먼저 현..

    [python] 백준 - 11660. 구간 합 구하기 5

    [python] 백준 - 11660. 구간 합 구하기 5

    🤔문제 해결 S1 | DP (0,0) 부터 리스트의 모든 지점까지 각각의 합을 구한다. 2번을 수행하고 나면 아래와 같은 결과를 얻을 수 있다. 합을 누적한 리스트로 아래 그림처럼 구하고자 하는 영역을 구하고 필요없는 부분은 빼주면 된다. 여기서 많이 헷갈릴 수 있는데 문제는 1,1부터 시작하지만 우리는 0,0부터 시작한다. 또, 빼줘야하는 영역(빨간색) 부분은 두번 빼는 경우가 있기 때문에 다시 더해줄 영역(초록색)을 한번 더해준다. 여기서 끝이 아니다. x축이 처음부터 인경우와 y축이 처음부터인 경우, 둘 다 아닌경우 이 3가지 경우로 나눠서 풀어줘야한다. 💨 시간초과 때문에 힘들었던 문제... 💻소스 코드 import sys from itertools import accumulate # 누적 합을 ..

    [python] 프로그래머스 - 기둥과 보 설치(2020 KAKAO BLIND RECRUITMENT)

    [python] 프로그래머스 - 기둥과 보 설치(2020 KAKAO BLIND RECRUITMENT)

    🤔문제 해결 Lv3 설치된 구조물의 정보를 리스트에 쌓는다. ex) 설치된_리스트: [(좌표, 좌표, 구조물), ..., (좌표, 좌표, 구조물)] | x,y,(기둥or보) 이 설치된 구조물 리스트를 for문을 돌며 이 구조물들의 설치가 조건에 맞는 지 체크한다. def check() 구조물 설치일 경우 일단 설치한다. 큰 3번을 체크한다. 구조물들이 조건에 맞지 않으면 추가한 것을 삭제한다. 구조물 삭제일 경우 일다 삭제한다. 3번을 체크한다. 구조물들이 조건에 맞지 않으면 삭제한 것을 추가한다. 잘 정렬해서 답을 출력한다.!!!!! 💨 여기서 set() 을쓰는 이유는 if a in list: 같은 경우 때문. 리스트로 탐색하는 경우는 O(n) 이지만 셋으로 탐색하는 경우는 O(1) 이다. 마지막에 답..

    [python] 백준 - 1074. Z

    [python] 백준 - 1074. Z

    🤔문제 해결 1. 재귀,분할정복 | S1 2. 모두 쪼개려고 하는경우 메모리초과 혹은 시간초과가 발생한다. 3. 내가 찾고자하는 행과 열이 포함된 박스만 찾아서 재귀함수를 실행시킨다. 4. 여기서 각 박스의 첫 숫자를 구한다. (1) 예를 들어 사이즈가 8인 박스의 첫숫자는 0이다. 왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래 순으로 박스를 쪼개면 (2) 각 박스의 첫 숫자는 0, 16, 32, 46 이다. (3) 왼쪽 위 박스는 그대로, 오른쪽 위 박스는 첫숫자에 (size//2)**2*1 값을 더해준다. (4) 왼쪽 아래 박스는 첫숫자에 (size//2)**2*2 값을, 오른쪽 아래 박스는 첫숫자에 (size//2)**2*3 값을 더해준다. 5. 박스의 크기가 2가 되면 찾고자 하는 행과 열을 찾..

    [python] 백준 - 11048. 이동하기

    [python] 백준 - 11048. 이동하기

    🤔문제 해결 1. DP | silver1 2. 주어진 2차원 배열보다 한칸씩 더 큰 0으로 채워진 배열을 만든다. (한칸씩 더 많은 이유는 가장 윗줄과 가장 왼쪽줄도 비교해주기 위해서) 3. 현재 지점의 값(maze)과 그 점 이전의 값들(왼쪽, 왼쪽위, 위)중 큰 값(dp)을 더해서 (dp에) 값을 계속 쌓아 준다. 💨 다이나믹프로그래밍 문제. BFS로도 간단히 풀 수 있지만 시간초과가 난다. 💻소스 코드 N, M = map(int, input().split()) maze = [list(map(int, input().split())) for _ in range(N)] # 가장 윗줄과 가장 왼쪽줄도 비교를 해줘야 하기 때문에 한칸씩 더해서 만들어준다. dp = [[0] * (M + 1) for _ in ..