본문 바로가기

Python/프로그래머스

[프로그래머스] [Python] 디스크 컨트롤러

문제 풀이

 

def solution(jobs):
    answer = 0

    # 작업의 시작 시간
    start_time = 0
    # 작업의 개수
    jobs_cnt = len(jobs)

    # 소요시간이 낮은 순으로 정렬
    jobs = sorted(jobs, key=lambda x: x[1])

    # jobs 배열이 빌 때까지
    while len(jobs):

        # 현재 jobs는 소요시간을 기준으로 정렬된 상태. 이제 여기에서 시작시간이 작은 순으로 찾는 작업을 한다.
        for i in range(len(jobs)):

            # 시작시간보다 작거나 같은 값을 찾는다. 소요시간은 이미 정렬되어 있기 때문에
            # 시작시간이 같거나 낮은 값 중 가장 소요시간이 작은 순으로 나오게 된다
            if jobs[i][0] <= start_time:
                # 현재 진행중인 업무의 소요시간을 더해 작업의 종료 시간, 즉 다음 업무의 시작 시간을 업데이트한다.
                start_time += jobs[i][1]

                # 현재 작업은 jobs[i][0], 작업이 들어온 시점부터 대기하고 있었다. 그 이전에는 현재 작업이 존재하지 않았기 때문에
                # 작업이 들어온 시점(jobs[i][0])을 전체에서 빼주면 대기시간을 포함한 현재 작업의 소요 시간이 남게 된다.
                answer += start_time - jobs[i][0]

                # 완료한 작업을 제거 후 반복문 탈출.
                jobs.pop(i)
                break

            # 이전 작업이 종료되었음에도 다음 작업이 들어오지 않았을 경우
            if i == len(jobs) - 1:
                # 시작 시간을 증가시킨다. 작업이 들어오지 않는 상태라도 시간은 계속 흐르기 때문.
                start_time += 1

    # 평균을 구하고 소수점 이하의 수를 버린다.
    # import math 후 answer = math.floor(answer / jobs_cnt) 이런 식으로도 가능하다.
    return answer // jobs_cnt

 

 

해당 문제는 제가 직접 풀지는 못했고, 파이썬으로 푸셨던 johnyejin 님의 포스팅을 참고하였습니다. 해당 링크는 하단에 같이 게시하겠습니다. 

 

참고 포스팅

johnyejin.tistory.com/132

 

[Python][힙] 프로그래머스 - 디스크 컨트롤러(LEVEL3)

문제출처 - https://programmers.co.kr/learn/courses/30/lessons/42627 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이

johnyejin.tistory.com

 

문제 링크

programmers.co.kr/learn/courses/30/lessons/42627?language=python3

 

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

하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다. 예를

programmers.co.kr