블로그

[프로그래머스, 자바스크립트] 알고리즘-44 다리를 지나는 트럭 본문

알고리즘

[프로그래머스, 자바스크립트] 알고리즘-44 다리를 지나는 트럭

wooluck 2020. 1. 6. 19:39

출처 : 프로그래머스 알고리즘 코딩테스트 Level.2

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

 

풀이 과정

 다리 위에 있는 트럭의 무게와 트럭의 위치를 파악이 필요하다.

그러므로 다리의 길이와 같은 길이를 갖는 배열을 선언하여 이를 통해 트럭의 무게, 위치를 관리한다.

또한, 다음 트럭의 무게를 확인하여 다리로 진입이 가능한지 불가능한지 검사해야한다.

 

답안

function solution(bridge_length, weight, truck_weights) {
  let count = 0;
  let arr = Array(bridge_length).fill(0);
  let sec = 0;
  let next = truck_weights[count];
  let loadWeight = 0;
  while (count > -1) {
    loadWeight -= arr.pop();
    if (weight >= next + loadWeight) {
      arr = [next].concat(arr);
      count += 1;
      loadWeight += next;
      next = truck_weights[count];
    } else {
      arr = [0].concat(arr);
    }
    sec += 1;
    if (!loadWeight) break;
  }
  return sec;
}

 

 처음에는 반복문 마다 reduce 함수를 사용하여 현재 다리 위에 있는 트럭의 무게를 계산했었지만

시간초과로 인해 실패가 발생하였다. 원인은 reduce 였다. 매 번 reduce를 두 번씩 호출하였고, 이로 인해 시간초과가 발생함을 확인했다. 

 

다리 위에 있는 트럭의 무게를 저장하는 변수를 선언 후 트럭이 진입하거나 빠질 때 마다 증감하면 reduce를 사용하지 않을 수 있다고 판단하여 수정하니 정상적으로 통과완료!

 

function solution(bridge_length, weight, truck_weights) {
  let count = 0;
  let arr = Array(bridge_length).fill(0);
  let sec = 0;
  let next = truck_weights[count];
  while (count > -1) {
    arr.pop();
    if (weight >= next + arr.reduce((acc, cur) => (acc += cur), 0)) {
      arr = [next].concat(arr);
      count += 1;
      next = truck_weights[count];
    } else {
      arr = [0].concat(arr);
    }
    sec += 1;
    if (!arr.reduce((acc, cur) => (acc += cur), 0)) break;
  }
  return sec;
}

*reduce를 2회 사용한 코드

 

Comments