문제
[https://school.programmers.co.kr/learn/courses/30/lessons/176962#][링크]
풀이
요약해보자면 현재 과제 / 다음 과제 시간을 비교해서 큰지 , 작은지 , 같은지를 비교
중단한 과제는 stack에 넣는데 , 나중에 stack을 조사할 때 가장 최근에 한 과제먼저 조사해줘야 함
코드
function solution(plans) {
plans = plans.map((plan) => {
const [a,b] = plan[1].split(':').map((v) => +v)
plan[1] = 60*a+b
plan[2] = parseInt(plan[2])
return plan
}).sort((a,b) => a[1] - b[1])
const result = []
const stack = []
for(let i=0;i<plans.length-1;i++){
const [subject , start , playtime] = plans[i]
if(start+playtime === plans[i+1][1]){
result.push(subject)
continue
}
if(start+playtime > plans[i+1][1]){
stack.unshift([subject, playtime - (plans[i+1][1] - start)])
}
if(start+playtime < plans[i+1][1]){//남는시간에 스택에 남아있는것 처리
result.push(subject)
let rest = plans[i+1][1] - (start+playtime)
while(rest > 0 && stack.length > 0){
if(rest >= stack[0][1]){
result.push(stack[0][0])
rest -= stack[0][1]
stack.shift()
} else{
stack[0][1] -= rest
break
}
}
}
}
result.push(plans.at(-1)[0])
for(let i=0;i<stack.length;i++){
result.push(stack[i][0])
}
return result
}
- 일단 정렬이 안되어있기 때문에 먼저 정렬을 해주고 , 그 다음 plans.length - 1만큼 반복해줌
- start+playtime === 다음 start 일때 과제가 완료된 것이기 때문에 result 배열에 교과목만 넣어줌
- start+playtime < 다음 start 일때 과제가 중단되었기 때문에 stack에 넣어주는데, 다음 start-현재 start만큼은 과제를 했기 때문에 과목,남은시간만 넣어줌 (중단 과제는 생각해보면 start시간이 필요없음).
- else일 경우 rest = 다음 과제 시작시간과 현재 끝난 시간의 차이(start+playtime)만큼 중단 과제를 할 수 있음. 나는 제일 최근 과제를 앞 인덱스부터 넣었기 때문에 stack 배열을 index 0부터 돌면서(말만 스택이지 그냥 큐) 조사
- rest >= playtime 이라면 남는 시간안에 해당 중단과제를 완료할 수 있다는 뜻이고, 완료했기 때문에 result에 추가하면서 stack에서도 빼주고, rest 시간 또한 -= playtime
- 반대의 경우 play -= rest를 해주면서 break.
- 이렇게 하면 plans의 제일 마지막 index는 조사하지 않는데, 문제에서 보면 중단 과제 vs 새 과제의 경우 우선순위가 새 과제라고 되어있음. 그러므로 마지막 index는 for문이 다 끝난 후에 바로 result에 넣어주면 됨
- 이후에 stack에 쌓여있는 중단과제들을 index 순서대로 result에 넣어주면 끝
'코딩테스트 연습' 카테고리의 다른 글
백준 1182 - 부분수열의 합 (0) | 2023.04.22 |
---|---|
백준 2217 - 로프 (1) | 2023.04.20 |
프로그래머스 - 이모티콘 할인행사(2023 KAKAO BLIND RECRUITMENT) (0) | 2023.04.18 |
프로그래머스 - 혼자서 하는 틱택토 (0) | 2023.04.18 |
프로그래머스 - 두 원 사이의 정수 쌍 (0) | 2023.04.17 |