https://school.programmers.co.kr/learn/courses/30/lessons/176962
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
접근법
00:00부터 시작하여 현재 시간에 해당하는 요소가 있을 경우 작업 리스트에 append로 맨 뒤에 추가하고,
가장 뒤에 있는 작업의 소요시간을 분마다 -1씩 감소시킨다. 그리고 소요시간이 0이 된 작업이 있으면 pop 하여 answer에 추가해 준다.
추가적으로 작업해야 하는 작업이 없을 경우 시간을 1분 증가시키고, continue를 통해 빠져나간다.
시도1
plans 배열이 정렬이 되어있지 않기 때문에 any를 통해 현재 시간에 해당하는 요소가 있는 확인하고, 있으면 해당 인덱스를 찾아 작업 리스트에 넣어주는 방식으로 했지만 5개의 테스트에서 시간 초과가 발생하였다.
문제풀이
def solution(plans):
plans = list(map(lambda x: [x[0],x[1],int(x[2])] ,plans))
len_answer = len(plans)
timer = [0,0]
queue_job = []
answer = []
while len(answer) != len_answer :
# 만약 새로운 작업이 들어온다면
if any(sublist[1] == f"{timer[0]:02d}:{timer[1]:02d}" for sublist in plans) :
target_idx = [index for index, target in enumerate(plans) if target[1] == f"{timer[0]:02d}:{timer[1]:02d}"][0]
queue_job.append(plans[target_idx])
# 작업해야하는 일이 없을 경우
if len(queue_job) == 0:
if timer[1] == 59 :
timer[0]+=1
timer[1]=0
else :
timer[1]+=1
continue
# 1분만큼 소요시간을 줄인다
queue_job[-1][2] -= 1
# 해당 작업의 소요시간이 0이면 answer에 추가한다
if queue_job[-1][2] == 0 :
answer.append(queue_job[-1][0])
queue_job.pop()
if timer[1] == 59 :
timer[0]+=1
timer[1]=0
else :
timer[1]+=1
return answer
시도2와 정답
while 문으로 반복될 때마다 any와 index를 반복하는 걸 해결하면 문제가 해결될 것이라는 생각이 들었습니다.
정렬이 되지 않았어 사용했기 때문에 처음부터 정렬을 하고 0인덱스와 비교하는 방식으로 해결했습니다.
추가적으로 시간 업데이트하는 함수를 만들어서 사용했습니다.
문제풀이
def increaseTime(timer) :
if timer[1] == 59 :
timer[0]+=1
timer[1]=0
else :
timer[1]+=1
return timer
def solution(plans):
len_answer = len(plans)
plans = list(map(lambda x: [x[0],x[1],int(x[2])] ,plans))
plans = sorted(plans, key=lambda x: x[1])
timer = [0,0]
queue_job = []
answer = []
while len(answer) != len_answer :
# 만약 새로운 작업이 들어온다면
if plans and plans[0][1] == f"{timer[0]:02d}:{timer[1]:02d}" :
queue_job.append(plans.pop(0))
# 작업해야하는 일이 없을 경우
if len(queue_job) == 0:
timer = increaseTime(timer)
continue
# 1분만큼 소요시간을 줄인다
queue_job[-1][2] -= 1
# 해당 작업의 소요시간이 0이면 answer에 추가한다
if queue_job[-1][2] == 0 :
answer.append(queue_job[-1][0])
queue_job.pop()
timer = increaseTime(timer)
return answer
'알고리즘 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] 연속된 부분 수열의 합 (1) | 2023.08.15 |
|---|---|
| [프로그래머스] 혼자서 하는 틱택토 (1) | 2023.08.03 |
| [프로그래머스] 배열 조각하기 (1) | 2023.04.21 |
| [프로그래머스] Lv.0 369게임 (JavaScript) (1) | 2023.04.14 |