[Python] 디스크 컨트롤러 / 힙

2024. 2. 10. 23:29· 자료구조&알고리즘/프로그래머스
목차
  1. 문제
  2. 코드
  3. 다른 사람 코드
  4. 접근법
  5. 배운 점
728x90

 

 

 

 


문제

https://school.programmers.co.kr/learn/courses/30/lessons/42627

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

코드

 

import heapq

def solution(jobs):
    jobs_len = len(jobs)
    jobs.sort(key=lambda x:x[0])
    heap = []
    total_time, current_time = 0, 0
    while jobs or heap:
        while jobs[0][0] <= current_time:
            job = jobs.pop(0)
            heapq.heappush(heap, (job[1], job[0]))
            print('heap:', heap)
            if heap:
                processing_time, starttime = heapq.heappop(heap)
                current_time += processing_time
                total_time += current_time - starttime
        else:
            current_time = jobs[0][0]
        
    print('totlal_time:', total_time)
    answer = total_time // jobs_len
    return answer

print(solution(jobs = [[0, 3], [1, 9], [2, 6]]))

 

 

 

다른 사람 코드

 

import heapq
from collections import deque

def solution(jobs):
    tasks = deque(sorted([(x[1], x[0]) for x in jobs], key=lambda x: (x[1], x[0])))
    q = []
    heapq.heappush(q, tasks.popleft())
    current_time, total_response_time = 0, 0
    while len(q) > 0:
        dur, arr = heapq.heappop(q)
        current_time = max(current_time + dur, arr + dur)
        total_response_time += current_time - arr
        while len(tasks) > 0 and tasks[0][1] <= current_time:
            heapq.heappush(q, tasks.popleft())
        if len(tasks) > 0 and len(q) == 0:
            heapq.heappush(q, tasks.popleft())
    return total_response_time // len(jobs)

 

 

 

접근법

 

  1. jobs 리스트를 작업이 요청되는 시점 기준으로 오름차순으로 정렬합니다.
  2. 현재 시간을 나타내는 변수를 초기화하고, 작업들을 차례로 처리합니다.
    1. 최소 힙을 사용하여 대기 중인 작업 중 소요시간이 가장 적은 작업을 선택합니다.
    2. 선택된 작업의 시작 시간이 현재 시간보다 이전이라면, 현재 시간을 시작 시간으로 업데이트합니다.
    3. 선택된 작업을 수행하고, 걸린 시간을 누적합니다.
  3. 작업을 처리하는 동안 현재 시간을 업데이트하고, 모든 작업을 처리한 후에는 누적된 시간을 작업의 개수로 나누어 평균을 구합니다.

 

 

 

배운 점

힙을 더 능숙하게 사용 할 수 있게 되었다.

저작자표시 비영리 (새창열림)

'자료구조&알고리즘 > 프로그래머스' 카테고리의 다른 글

[Python] 이중우선순위 큐 - 힙  (0) 2024.02.12
[Python] K번째 수 - 정렬  (0) 2024.02.12
[Python] 더 맵게 - 힙  (1) 2024.02.10
[Python] 프로세스 - 스택/큐  (0) 2024.02.07
[Python] 올바른 괄호 - 스택/큐  (0) 2024.02.06
  1. 문제
  2. 코드
  3. 다른 사람 코드
  4. 접근법
  5. 배운 점
'자료구조&알고리즘/프로그래머스' 카테고리의 다른 글
  • [Python] 이중우선순위 큐 - 힙
  • [Python] K번째 수 - 정렬
  • [Python] 더 맵게 - 힙
  • [Python] 프로세스 - 스택/큐
두잇 두두
두잇 두두
읽기 쉬운 코드를 짜기 위해 노력합니다. 좋은 코드는 단순하고 이해하기 쉬워야 한다고 생각합니다.
두두 DB읽기 쉬운 코드를 짜기 위해 노력합니다. 좋은 코드는 단순하고 이해하기 쉬워야 한다고 생각합니다.
두잇 두두
두두 DB
두잇 두두
전체
오늘
어제
  • 분류 전체보기 (135)
    • CS지식 (7)
    • 시스템 설계 (5)
    • 자료구조&알고리즘 (36)
      • 자료구조 (1)
      • 백준 (13)
      • 프로그래머스 (15)
      • 인프런 (2)
    • Python (9)
      • Docs (3)
      • 실험실 (2)
    • Django (36)
      • orm (10)
      • view (3)
      • model (3)
      • admin (3)
      • restframework (13)
      • error (1)
      • utils (2)
    • Java (2)
      • JPA (3)
    • AI (1)
      • AI가 쓴 글 (1)
    • Git (4)
    • Linux (1)
    • 개발자로써 (8)
      • 회고 (1)
    • 문화생활 (0)
      • 여행 (0)
    • 도서📚 (0)
      • 일반 도서 (0)
      • 개발 도서 (0)
    • 프론트 (1)
      • snippet (1)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
두잇 두두
[Python] 디스크 컨트롤러 / 힙
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.