[코딩테스트/프로그래머스/Python]디스크 컨트롤러

Enter·2021년 7월 16일
0

코딩테스트

목록 보기
11/68

💡생각

  1. heapq사용하기.
  2. 작업의 요청부터 종료까지 걸린 시간의 평균을 가장 줄이는 방법 = 소요시간 적은것부터 실행(SJF방식)



❓잘못된 코드1

테스트 케이스는 통과했지만 채점을 통과하지 못함.

문제점1. return할 때 소수점 이하는 버려야 함.
문제점2. jobs에 해야하는 작업이 남아있지만 아무일도 하지 않는 경우도 고려해야 하므로 h가 비어있다고 무작정 return하면 안됨.


해결: math.trunc( )함수를 이용해 소수점이하는 버림. count변수를 만들어 jobs에 해야하는 작업을 다 h로 가져왔는지 확인함.



💡테스트 통과한 코드

obs: [작업이 요청되는 시점, 작업의 소요시간]을 담은 2차원 배열
time: 시간
run: 요청 들어온 작업시간
answer: 지금까지 작업한 작업의 요청부터 종료까지 걸린 시간의 합
count: jobs에 담겨있던 작업을 다 heap에 가져왔는지 확인하는 변수
tmp: 요청 들어온 작업의 시간과 요청시점을 임시저장할 변수
h: 작업의 소요시간을 기준으로 오름차순 정렬한 배열


반복문을 이용해 한바퀴를 돌때마다 time이 0부터 1씩 커지도록 설정하였다.
jobs에 있는 작업 중 작업이 요청되는 시점과 time이 동일하면 그 작업을 h에 (작업의 소요시간, 작업이 요청되는 시점)순으로 삽입하였다.(heap은 튜플을 삽입할 경우 인덱스0인것을 기준으로 정렬하기 때문.)
그리고 작업을 h에 삽입할 때 마다 count + 1해준다.
만약 h가 비어있지 않고 지금 작업하고 있는 것이 없다면(run = 0) h에서 꺼내 tmp에 담는다.
그리고 answer에 (지금시간+작업의 소요시간-작업이 요청된 시간 = 작업이 끝난시간-작업이요청된시간 = 작업의 요청부터 종료까지 걸린 시간)을 더해준다.
run에는 작업의 소요시간을 넣어주고 한 바퀴를 다 돌았기 때문에 run-1을 해준다.(시간이 1초흘렀음을 의미.)
작업하고 있는 것이 있다면 한 바퀴를 다 돌았기 때문에 run-1을 해준다.(시간이 1초흘렀음을 의미.)
while문을 반복하다가 jobs에 담겨있던 작업을 h에 다 가져왔고 h 또한 비어있다면 모든 작업이 종료된 것이기 때문에 answer값을 모든 작업의 수로 나눠준 뒤 소수점 이하를 버리고 return한다.




⏬다른사람의 코드

코드가 간단하고 heap과 deque을 같이 활용한 것이 대단함.
이번 내 코드에 변수가 너무 많아 효율성 테스트가 있었다면 통과를 못했을 것 같음.




✅math모듈의 올림, 버림, 내림

math.ceil(i): 올림
math.trunc(i): 버림
math.floor(i): 내림.







🔗프로그래머스 - 디스크 컨트롤러
https://programmers.co.kr/learn/courses/30/lessons/42627

profile
Cherish the moment :)

0개의 댓글