2 분 소요

사용 언어: Python3, Java

문제

과제 진행하기

풀이

나의 풀이

def solution(plans):
    def timeToMin(str):
        hh, mm = map(int, str.split(':'))
        return hh * 60 + mm
    
    plans.sort(key=lambda x:x[1]) # 시작 시간 순으로 오름차순 정렬
    
    for x in plans:
        x[1], x[2] = timeToMin(x[1]), int(x[2])
    print(plans)
    
    stack = [] # 멈춘 과제
    ans = [] # 끝낸 과제
    now = plans[0][1] # 현재 시간
    for i in range(len(plans)):
        if i == len(plans) - 1: # 마지막 과제는 무조건 마칠 수 있다 (뒤에 시작해야하는 과제가 없기 때문)
            ans.append(plans[i][0])
            while stack: # stack에 남은 과목 모두 처리
                ans.append(stack.pop()[0])
            break
            
        if now + plans[i][2] > plans[i+1][1]: # 과제를 끝마치기에 시간이 부족한 경우
            plans[i][2] -= (plans[i+1][1] - plans[i][1]) # 할 수 있는데까지 하고 stack에 넣기
            now += (plans[i+1][1] - plans[i][1]) # 현재 시간 갱신
            stack.append([plans[i][0], plans[i][2]])
            
        elif now + plans[i][2] <= plans[i+1][1]: # 과제를 끝마칠 수 있는 경우
            now += plans[i][2]
            ans.append(plans[i][0]) # ans에 넣기
            
            if now < plans[i+1][1]: # 만약 시간이 남는다면
                while stack: # stack 돌면서 처리
                    name, remain_time = stack.pop() # 과목이름, 남은시간
                    if now + remain_time > plans[i+1][1]: # 끝마치기에 시간이 부족한 경우
                        remain_time -= (plans[i+1][1] - now)
                        now += (plans[i+1][1] - now) # 현재 시간 갱신
                        stack.append([name, remain_time]) # 할 수 있는데까지 하고 다시 stack에 넣기
                        break
                    elif now + remain_time <= plans[i+1][1]: # 끝마칠 수 있는 경우
                        now += remain_time # 현재 시간 갱신
                        ans.append(name) # 뺀 item을 ans에 넣는다 (stack에는 다시 넣지 않는다)
                        if now == plans[i+1][1]:
                            break # 시간이 남으면 break 하지 않고 계속해서 stack을 돈다
    
    return ans
  • 테스트 케이스: 성공
  • 제출 결과: 실패

다른 풀이

참고

def solution(plans):
    for x in plans:
        hh, mm = map(int, x[1].split(':'))
        x[1], x[2] = hh * 60 + mm, int(x[2])
    plans.sort(key=lambda x:x[1]) # 시작 시간 순으로 오름차순 정렬
    
    ans = [] # 끝낸 과제
    stack = [] # 멈춘 과제
    for i in range(len(plans)):
        if i == len(plans) - 1:
            ans.append(plans[i][0])
            while stack: # stack에 남은 과목 모두 처리
                ans.append(stack.pop()[0])
            break
            
        name, start, playtime = plans[i]
        nx_name, nx_start, nx_playtime = plans[i+1] # 다음 과제
        
        if start + playtime <= nx_start: # 과제를 끝마칠 수 있는 경우
            ans.append(name)
            remain_time = nx_start - (start + playtime) # 다음 과제 시작 전까지 남는 시간
            
            while stack and remain_time != 0:
                stk_name, stk_start, stk_playtime = stack.pop() # 멈춘 과제
                if remain_time >= stk_playtime: # 멈춘 과제를 끝마칠 수 있는 경우
                    ans.append(stk_name)
                    remain_time -= stk_playtime
                else: # 멈춘 과제를 끝마칠 수 없는 경우
                    stack.append([stk_name, stk_start, stk_playtime - remain_time]) # 다시 stack 에 넣기
                    remain_time = 0 # while문 탈출 조건
                    
        else: # 과제를 끝마칠 수 없는 경우
            plans[i][2] = playtime - (nx_start - start) # 남은 시간 갱신
            stack.append(plans[i]) # 하는데까지 하고 stack 에 넣기
    
    return ans
  • 테스트 케이스: 통과
  • 제출 결과: 성공

스크린샷 2023-07-05 오후 3 27 34



💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기