무지의 먹방 라이브(javascript)

[(2018년)KAKAO BLIND RECRUITMENT] 무지의 먹방 라이브

javascript


조건

  • 무지는 1번 음식부터 먹기 시작하며, 회전판은 번호가 증가하는 순서대로 음식을 무지 앞으로 가져다 놓는다.
  • 마지막 번호의 음식을 섭취한 후에는 회전판에 의해 다시 1번 음식이 무지 앞으로 온다.
  • 무지는 음식 하나를 1초 동안 섭취한 후 남은 음식은 그대로 두고, 다음 음식을 섭취한다.
  • 다음 음식이란, 아직 남은 음식 중 다음으로 섭취해야 할 가장 가까운 번호의 음식을 말한다.
  • 회전판이 다음 음식을 무지 앞으로 가져오는데 걸리는 시간은 없다고 가정한다.

제한사항

  • food_times 는 각 음식을 모두 먹는데 필요한 시간이 음식의 번호 순서대로 들어있는 배열이다.
  • k 는 방송이 중단된 시간을 나타낸다.
  • 만약 더 섭취해야 할 음식이 없다면 -1을 반환하면 된다.

입출력 예

food_times k result
[3,1,2] 5 1

코드

function solution(food_times, k) {
  let sortFoodTimes = [];
  const len = food_times.length;

  //1. {index, time} 구조의 배열로 생성
  //2. time 오름차순으로 정렬
  sortFoodTimes = food_times
    .map((time, index) => {
      return { index: index + 1, time };
    })
    .sort((a, b) => {
      return a.time - b.time;
    });

  //3. K를 넘어가는 순간을 찾아서 반환
  for (let i = 0; i < len; i++) {
    const food_time = sortFoodTimes[i].time; //index의 음식을 먹는데 필요한 시간
    const remains_foods_len = len - i; //남은 음식의 갯수
    const roop_time = (food_time - (i == 0 ? 0 : sortFoodTimes[i - 1].time)) * remains_foods_len; //현재 roop의 음식을 먹는데 걸리는 시간

    if (k < roop_time) {
      return sortFoodTimes.slice(i).sort((a, b) => a.index - b.index)[k % remains_foods_len].index;
    }
    k -= roop_time; //먹은 음식들의 시간을 제외
  }

  return -1;
}

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

© 2021 AnGwangHo, Built with Gatsby