Level 3. 디스크 컨트롤러

Pear_Mh·2021년 8월 2일
0

Programmers-Level 3.

목록 보기
3/5

디스크 컨트롤러 [힙(Heap)]

코딩테스트 연습 > 힙 > 디스크 컨트롤러

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



문제 구상

  • 입력: [작업이 요청되는 시점, 작업의 소요시간]으로 구성된 리스트(jobs)
  • 출력: 작업의 요청부터 종료까지 걸린시간의 평균
  • 구상:
    1. 요청시간, 소요시간의 초기값을 0으로 설정하고, 작업의 갯수를 저장합니다.
    2. 소요시간을 기준으로 작업 리스트를 정렬합니다.
    3. while문으로 반복하며 for문으로 정렬된 작업 리스트의 작업을 탐색하며,
      1) 해당 작업의 요청시간이 요청시간 보다 작거나 같을 경우,
      2) 요청시간에 해당 잡업의 소요시간을 더하여 요청시간을 갱신합니다.
      3) 해당 요청시간으로부터 작업의 요청시간을 빼 소요시간을 계산합니다.
      4) 1)이 성립한 경우 break를 통해 해당 if문을 종료합니다.
    4. for문을 수행했음에도 break되지 않은 경우 요청시간에 1을 더하여 갱신합니다.
    5. 위의 과정이 종료되어 계산된 총 소요시간의 평균을 출력합니다.

문제 풀이

# 입력값(시작시간, 소요시간)
jobs = [[0, 3], [1, 9], [2, 6]]
# 초기값 설정
start, count, number = 0,0,len(jobs) # 요청시간, 소요시간, 작업의 갯수
jobs.sort(key=lambda x:x[1])
while jobs:
    for j in range(len(jobs)):
        if jobs[j][0] <= start: # job[j]의 요청시간이 start보다 작거나 같은 경우,
            start += jobs[j][1] # 다음 작업의 start의 시간을 갱신하고
            count += start - jobs[j][0] # 소요시간을 계산
            jobs.pop(j) # 해당 작업이 완료되었으니 pop하여 제거
            break
        if j == len(jobs)-1: #for문을 다 수행했음에도 break되지 않은 경우,
            start+=1 # 요청시간 +1
count//number # 소요시간의 평균 계산

전체 코드

def solution(jobs):
    cnt,start,length = 0,0,len(jobs)
    jobs.sort(key=lambda j:j[1])

    while jobs:
        for j in range(len(jobs)):
            if jobs[j][0]<=start:
                start+=jobs[j][1]
                cnt += start - jobs[j][0]
                jobs.pop(j)
                break
            if j == len(jobs)-1:
                start+=1
    return cnt//length
profile
Beyond the new era.

0개의 댓글