본문 바로가기
개발/Algorithm 문제 풀이

[프로그래머스] lv.2 과제 진행하기

by DenverAlmighty 2024. 1. 28.
반응형

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

 

프로그래머스

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

programmers.co.kr

나의 풀이

from collections import deque

def solution(plans):
	# 리스트 시간순 정렬
    plans.sort(key=lambda x:x[1])
    
    # 시간을 숫자로 변환 및 타입 변경
    for i in range(len(plans)):
        h, m = plans[i][1].split(':')
        plans[i][1] = int(h)*60+int(m)
        plans[i][2] = int(plans[i][2])

    stop = deque()   
    answer = []
    
    for i in range(len(plans)):
        now = plans[i][1]
        next_st = now
        # next_st를 리스트 마지막이면 다음 시작 시간이 없으므로 해당 과목 끝나는 시간으로 설정
        if i == len(plans)-1:
            next_st = now+plans[i][2]
     	# 아닌 경우 다음 과목 끝난느 시간으로 설정
        else:
            next_st = plans[i+1][1]
        
        # 실제 사용한 시간
        used = now+plans[i][2]-next_st
        # 남은 시간
        rest = next_st-(now+plans[i][2])
        # 현재 시간
        now += used
        # 시간이 부족했다면 stop에 추가
        if rest<0:
            stop.append([plans[i][0], -rest])
        # 시간이 딱맞게 끝났거나 남았다면
        if rest>=0:
            answer.append(plans[i][0])
            # 남은 시간 없을 때 까지
            while rest>0:
            	# stop에 과목있다면 
                if len(stop)>0:
                    [sub, time] = stop.pop()
                    # 꺼낸 과제 완료
                    if rest>=time:
                        answer.append(sub)
                        rest-=time
                    # 시간 부족했으면 다시 stop에 넣기
                    else:
                        used = time-rest
                        stop.append([sub, used])
                        rest=0
                else:
                    break
            
		# 리스트 마지막까지 돌았으면, 역순으로 과목 끝내므로 answer에 추가
        if i == len(plans)-1 and len(stop)>0:
            while len(stop)>0:
                answer.append(stop.pop()[0])
            
    return answer

오랜만이라 머리가 안돌아간다

다른 사람의 풀이

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

이 방법은 시간이 오래 걸리긴 한다. 

728x90
반응형