상세 컨텐츠

본문 제목

[프로그래머스] 176962. 과제 진행하기 | 구현 | 파이썬, 소스코드, 정답

Coding Test/문제풀이

by yooputer 2023. 5. 3. 09:22

본문

 

https://school.programmers.co.kr/learn/courses/30/lessons/176962

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 요약

과제에 대한 정보인 [name, start, playtime]을 원소로하는 plans 배열이 주어지고 정해진 규칙에 따라 과제를 처리한다.

과제를 끝낸 순서를 배열에 담아 반환하라.

 

과제 처리 규칙

  1. 과제는 start 시간부터 진행한다
  2. 만약 새로운 과제를 시작할 시간이 주어지면 기존 과제를 멈추고 새로운 과제를 시작한다
  3. 진행중이던 과제를 끝내면 기존에 진행중이던 과제를 이어서 진행한다.
  4. 만약 기존에 진행중이던 과제가 여러개인 경우 가장 최근에 멈춘 과제부터 이어서 진행한다.

문제 조건

  • 3 <= len(plans) <= 1000
  • start의 형태는 "hh:mm"이다. 

시행착오

시간 형태가 hh:mm이기 때문에 시간을 다루는대에 애를 먹었다.

hh:mm 형태로 처리하지 않고 분단위로 변환하여 처리했다. 


접근 방법

  1. start가 빠른 과제부터 실행하기 위해 start를 기준으로 오름차순 정렬을 한다
  2. start 시간을 분단위로 변환한다. 
  3. 남은 과제를 관리하기 위해 스택을 사용한다


소스코드

def solution(plans):
    answer = []
    stack = []

    plans.sort(key= lambda x: x[1])

    def getTime(i):
        h = int(plans[i][1][:2])
        m = int(plans[i][1][3:])
        return h * 60 + m

    def doTheRemainingAssignmentsBeforeNext(now, next):
        while next > now and stack:
            name, playtime = stack.pop()
            if playtime <= next - now:
                answer.append(name)
                now += playtime
            else:
                stack.append((name, playtime - (next - now)))
                break

    # N-1번째 과제까지 처리
    for i in range(len(plans) - 1):
        now = getTime(i)
        playtime = int(plans[i][2])
        next = getTime(i+1)

        if now + playtime <= next:
            answer.append(plans[i][0])
            now += playtime

            doTheRemainingAssignmentsBeforeNext(now, next)
        else:
            stack.append((plans[i][0], playtime - (next - now)))

    # 마지막 과제 처리, 남은 과제 처리
    answer.append(plans[-1][0])

    while stack:
        name, playtime = stack.pop()
        answer.append(name)

    return answer

 

 

 

관련글 더보기