gurwhddl
코알못 공부블로그
gurwhddl
전체 방문자
오늘
어제
  • 분류 전체보기
    • CSS
    • JS
    • node.JS
    • REACT
    • 코딩테스트 연습

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
gurwhddl

코알못 공부블로그

코딩테스트 연습

프로그래머스 - 과제 진행하기

2023. 4. 19. 23:00

문제

[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
    '코딩테스트 연습' 카테고리의 다른 글
    • 백준 1182 - 부분수열의 합
    • 백준 2217 - 로프
    • 프로그래머스 - 이모티콘 할인행사(2023 KAKAO BLIND RECRUITMENT)
    • 프로그래머스 - 혼자서 하는 틱택토
    gurwhddl
    gurwhddl

    티스토리툴바