⚡️algorithm/accepted

[구현, 그리디?] 프로그래머스 lv2. 과제 진행하기

남남이루 2023. 4. 20. 23:41

문제

프로그래머스 문제 바로가기

요약

* 1. 정해진 시간이 되면 과제를 시작한다.
* 2. 진행중이던 건 멈춘다.
* 3. 정해둔거 끝나면 멈춰둔거 한다
* 4. 멈춰둔거 여러개면 마지막에 하던거 한다 => 스택

접근

    '''
    CASE 1. done : 다음꺼까지 남은 시간 >= 소요시간
        1-1. wait 리스트 소모

    CASE 2. not done : 다음꺼까지 남은 시간 < 소요시간
        2-1. wait 으로 넘김
             남은 시간 업데이트
     '''
def solution(plans):

    # 과목 , 시작, 소요시간
    def getTime(time_str):
        h, m = map(int, time_str.split(':'))
        time_int = h*60+m
        return time_int

    wait = []
    done = []
    plans = sorted([[t, getTime(x), int(d)] for t,x,d in plans],key=lambda x: x[1]) + [["",24*60,100 ]]
    board = {title: res for title, _, res in plans}

    for idx, item in enumerate(plans[:-1]):
        title, start_at, duration = item
        next_start_at = plans[idx+1][1]
        term = next_start_at - start_at

        if term < duration:    # CASE 2
            wait.append(title)
            board[title] = duration - term

        else:                         # CASE 1
            done.append(title)
            small_term = next_start_at - (start_at + duration)

            while small_term > 0 and wait:
                t = wait.pop()
                if board[t] <= small_term:
                    done.append(t)
                    small_term -= board[t]

                else:
                    board[t] -= small_term
                    wait.append(t)
                    break

    return done+wait[::-1]

교훈

  • 직관적인 변수 하나가 복잡한 덧셈 뺄셈을 정리해준다
  • 바로 코드부터 쓰려고 했더니, 테스트 케이스에서만 맞고 실제 채점에선 실패했다.
  • 구상부터 하고, 코드 짜는 연습하자
  • 구현이 아직 약하다..ㅠㅠ

참고할 풀이 (프로그래머스 다른 사람 답)

def solution(plans):
    plans = sorted(map(lambda x: [x[0], int(x[1][:2]) * 60 + int(x[1][3:]), int(x[2])], plans), key=lambda x: -x[1])

    lst = []
    while plans:
        x = plans.pop()
        for i, v in enumerate(lst):
            if v[0] > x[1]:
                lst[i][0] += x[2]
        lst.append([x[1] + x[2], x[0]])
    lst.sort()

    return list(map(lambda x: x[1], lst))

어케했누...