[programmers] lv.2 과제 진행하기

jeongjeong2·2023년 4월 16일
0

For coding test

목록 보기
39/59

문제 바로가기

문제 접근

plans 수 최대 1000개.. 그냥 단순 구현

  • 진행하다가 멈추는 과제는 ing에 담고, 끝난 과제는 fin에 담아서 기록
  • 현재 시간은 time_change를 통해 int값으로 정의
  • 현재시간 + 걸리는 시간과 다음 과제 시작 시간을 비교하면서 fin,ing비교
  • 만약 과제를 끝낸 현재시간과 다음 과제 시작 시간 간에 간격이 발생할 경우 ing.pop을 통해 하다만 과제를 다시 진행 (ing에는 [과목,남은시간]형태로 append해서 기록) 이 때 남은 시간을 update하며 저장했다.

단순하지만 구현에 있어서 시간이 오래 걸린 문제.

정답 코드

def time_change(l): # 시간 표현 바꾸는 함수
    for idx,(sub,start,time) in enumerate(l):
        a,b = list(map(int,start.split(':')))
        l[idx][1] = 60*a + b
    return sorted(l, key=lambda x: x[1]) # 시작 순서대로 배열
def solution(plans):
    ing = [] # 진행 중인 과제
    fin = [] # 마무리한 과제 
    plans = time_change(plans)
    now = plans[0][1] # 현재 시간은 맨 첫번째 과제 시작시간
    for idx,plan in enumerate(plans[:-1]): # idxError피하려고 마지막 항은 포함 x
        sub = plan[0]
        start = plan[1]
        time = plan[2]
        if now + int(time) <= plans[idx+1][1]: # 다음 과목 시작 시간과 비교해서 더 작으면
            fin.append(sub) # 과제 끝내서 fin에 append
            now = now + int(time) # 지금 시간 update
            last = plans[idx+1][1]-now # 다음과제 시작 시간까지 남은시간
            while last != 0 and ing: # 남은 시간동안 ing의 과제 진행
                ing_sub, last_time = ing.pop()
                if last_time <= last: # 남은 시간 동안 과제 마무리할 수 있으면
                    last = last - last_time # 남은시간에서 과제 진행한 시간 빼주고
                    fin.append(ing_sub) # 마무리한 과제 fin에 append
                else: # 남은 시간동안 과제 못 끝내면
                    ing.append([ing_sub,last_time-last]) # ing의 과제 남은 시간 update
                    last = 0
            now = plans[idx+1][1] # 다음 과제 시작
        else: # 다음 과제 시작시간인데 지금 과제 못 끝냈으면
            ing.append([sub, start+int(time) - plans[idx+1][1]]) # ing에 [과목명,남은시간] append
            now = plans[idx+1][1] # 다음 과제 시작
            
    sub = plans[-1][0] 
    fin.append(sub) # 마지막 과제 일단 끝내고
    for i in ing[::-1]: # ing의 과제 차례로 끝냄
        fin.append(i[0])
        
    return fin

다른 사람 풀이.. 뭐 비슷한 듯. pass

0개의 댓글