Coding Test/programmers

[Python] 파이썬 프로그래머스 과제 진행하기

파송송 2023. 3. 31. 20:40
728x90

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

 

프로그래머스

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

programmers.co.kr


나의 풀이

  • 과제가 주어졌을 때(시간별로 정렬되어 있지 않음) 시작 시간에 과제를 시작함
  • 다음 과제시간이 되면 이전에 하던 과제는 그만해야 함
  • 과제 시간이 끝나고 다음 과제 시간까지 텀이 있다면 못 끝낸 과제를 진행함
  • 가장 최근에 멈춘 과제부터 시작해야 함

우선 plans의 시간을 minutes로만 표현하고 시간이 빠른 순서대로 정렬한다. 

그 후 순서대로 2개의 plan을 가져와 앞의 과제가 끝나는 시간과 다음 과제의 시작 시간을 비교한다.

pred_end > tail_start라면 과제를 중단한 것이기 때문에 left_table에 과제명과 남은 시간을 저장한다.

pred_end <= tail_start 라면 과제 후 시간이 남은 것이기 때문에 중단한 과제를 시작해야 한다.

남은 시간을 left_time에 넣고 left_table에서 중단된 과제를 가져와 처리한다.

 

가장 최근에 멈춘 과제부터 시작해야 하기 때문에 Stack을 사용함

 

def change_time(time):
    hours, minutes = map(int,time.split(':'))
    return int(minutes + (hours*60))

def solution(plans):
    answer = []
    left_table = []
    left_time = 0
    for plan in plans:
        plan[1] = change_time(plan[1])
    plans.sort(key=lambda x: x[1])

    for i, (plan_1, plan_2) in enumerate(zip(plans, plans[1:])):
        pred_end, tail_start = plan_1[1]+int(plan_1[2]), plan_2[1]

        if pred_end > tail_start:
            left_table.append([plan_1[0], pred_end - tail_start])
        else:
            answer.append(plan_1[0])
            left_time = tail_start - pred_end

            while left_time > 0:
                if left_table:
                    plan = left_table.pop()
                    left_time = left_time - plan[1]
                else:
                    break

                if left_time >= 0 :
                    answer.append(plan[0])
                else:
                    plan[1] = -left_time
                    left_table.append(plan)

    answer.append(plans[-1][0])
    while left_table:
        answer.append(left_table.pop()[0])

    return answer


다른 사람의 코드

나는 남은 시간을 없애는 방식으로 접근했으나 work 시작 ~ work 끝의 시간을 구해 길이가 짧은 순서대로 반환함

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])

    print(plans)
    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))

728x90