[프로그래머스, JS] 무지의 먹방 라이브

홍건우·2023년 3월 20일
0

coding test

목록 보기
1/1

문제

https://school.programmers.co.kr/learn/courses/30/lessons/42891?language=javascript

정답


function solution(food_times, k) {
  const len = food_times.length;
  
  let foods = food_times.map((time, idx) => {return {idx: idx + 1, time}}).sort((a, b) => a.time - b.time);

  let prev_time = 0;
  for(idx in foods) {
      let cur_time = foods[idx].time;
      let remain_len = len - idx;
      let eat_time = (cur_time - prev_time) * remain_len;
      prev_time = cur_time;
      
      if (k < eat_time) {
          foods = foods.slice(idx).sort((a, b) => a.idx - b.idx);
          return foods[k % remain_len].idx;
      }
      k -= eat_time;
  }
  
  return -1;
}

풀이

  1. 음식의 번호(idx)와 음식 시간(time)을 객체 형태로 저장하는데 이 과정에서 sort를 사용해 음식 시간이 가장 적은 것부터 배열에 저장되게 한다.
  2. 음식 시간이 가장 적은 것 부터 순서대로 음식을 다 먹는데 걸리는 시간을 구한다.
    음식을 먹는데 걸리는 시간 = (현재 음식 시간 - 이전 음식 시간) * 남은 음식의 수
  3. 현재 음식을 다 먹는데 걸리는 시간보다 남은 시간(k)이 더 작다면 남은 음식중 먹어야 할 음식이 무엇인지 구한다.
    방송 중단 후 먹어야할 음식 인덱스 = k % 남은 음식 개수

느낀점

이 문제는 시간내에 푸는 것을 실패한 문제이다. 정확성에서는 통과를 하여도 과도한 for문 사용으로 인해 효율성에서 문제가 발생했고 주어진 시간에 끝내 풀지 못했다. 이 문제의 핵심은 음식을 먹는 시간을 계산하는 과정에서 시간이 1분씩 줄어드는 것이 아닌 여러 상황을 고려하여 먹는 시간 계산을 단축시키는 것이 정확성과 효율성을 모두 만족하는데 핵심이라고 생각하는데 마땅한 방법이 떠오르지 않았고 결국 다른 사람의 풀이를 참고하였다.

https://velog.io/@hadam/JS-Q06-%EB%AC%B4%EC%A7%80%EC%9D%98-%EB%A8%B9%EB%B0%A9-%EB%9D%BC%EC%9D%B4%EB%B8%8C#%EC%A0%95%EB%8B%B5

profile
컴퓨터공학과 학생입니다

0개의 댓글