coding test

[파이썬] 과제 진행하기

잔망루피 2023. 4. 5. 18:49

🌱 나의 풀이

def solution(plans):
    answer = []
    plans.sort(key=lambda x: x[1])
    stop = []

    while plans:
        if len(plans) > 1:
            name1, start1, playtime1 = plans[0]
            name2, start2, playtime2 = plans[1]
            t1 = int(start1[:2]) * 60 + int(start1[3:])
            t1_end = t1 + int(playtime1)
            t2 = int(start2[:2]) * 60 + int(start2[3:])
            if t1_end > t2:  # 새로운 일이 들어옴, 현재 작업 중단
                stop.append([t1_end - t2, name1])
                plans.pop(0)
            else:  # 진행중인 과제를 끝냄
                answer.append(name1)
                plans.pop(0)
                temp = t2 - t1_end
                while stop:
                    if stop[-1][0] <= temp:  # 중단된 작업 다시 시작
                        temp -= stop[-1][0]
                        answer.append(stop.pop()[1])
                    else:
                        stop[-1][0] -= temp
                        break
        else:
            answer.append(plans.pop(0)[0])

    return answer + list(map(lambda x : x[1], stop[::-1]))

1. plans 리스트에 원소가 2개 이상 있으면

  • 현재 작업 plans[0]의 끝나는 시각 > 다음 작업 plans[1]의 시작 시각
    • 현재 작업 plans[0]을 진행하던 중에 다음 작업 plans[1]이 들어왔다.
    • 현재 작업을 중단한다. 
      • stop에 [남은 시간, 이름]을 추가
  • 그렇지 않으면, 진행 중인 과제를 끝낼 수 있다.
    • answer에 추가한다.
    • 중단된 작업이 있으면
      • 최근 중단된 작업 stop[-1][0] <= 다음 작업까지 남은 시간
        • answer에 최근 중단된 작업을 추가한다.
      • 그렇지 않으면, 최근 중단된 작업의 남은 시간 - 다음 작업까지 남은 시간

2. plans에 원소가 1개 남았으면 answer에 바로 추가한다.

3. stop에 남은 원소가 있을 수도 있어서 추가한다.

 

 

🐘 다른 사람 풀이

# https://cochin-man.tistory.com/25
import copy

def solution(plans):
    answer = []
    stop = []
    plans = sorted(plans, key = lambda x : x[1])
    for i in range(len(plans)) :
        if i != len(plans) - 1 :    # 마지막이 아니라면
            temp = int(plans[i][1][0:2]) * 60 + int(plans[i][1][3:]) + int(plans[i][2])
            next = int(plans[i+1][1][0:2]) * 60 + int(plans[i+1][1][3:])
            if temp <= next :
                answer.append(plans[i][0])  # 다음 것 안에 끝났으면
                if len(stop) > 0 :      # 멈춘 것이 있다면
                    lis = copy.deepcopy(stop)
                    tp = next - temp
                    for j in range(len(stop) - 1, -1, -1) :
                        if stop[j][1] <= tp :
                            tp -= stop[j][1]
                            answer.append(stop[j][0])
                            lis.pop()
                        else :
                            lis[-1][1] = stop[j][1] - tp
                            break
                    stop = copy.deepcopy(lis)
            else :      # 못 끝낸다면
                stop.append([plans[i][0], temp - next])
        else :
            answer.append(plans[i][0])      # 마지막꺼는 걍 끝내면 된다.
            
    for i in range(len(stop) - 1, -1, -1) :
        answer.append(stop[i][0])
                
    return answer

나와 비슷한 풀이

 

 

 

문제 출처 👇

https://school.programmers.co.kr/learn/courses/30/lessons/176962?language=python3 

 

프로그래머스

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

programmers.co.kr

 

반응형

'coding test' 카테고리의 다른 글

[파이썬] 부대복귀  (0) 2023.04.11
[파이썬] 호텔 대실  (0) 2023.04.10
[파이썬, Java] 택배 배달과 수거하기  (0) 2023.04.02
[파이썬] 디펜스 게임  (0) 2023.04.01
[파이썬] 17822. 원판 돌리기  (0) 2023.03.16