[프로그래머스] 다리를 지나는 트럭 (JavaScript)

nnm·2020년 5월 9일
0

프로그래머스 다리를 지나는 트럭

문제풀이

Java로 풀었을 때의 코드를 바탕으로 그대로 옮겨서 한 번 풀었고 그 다음으로 JavaScript 문법을 사용하여 코드를 줄일 수 있는 부분들을 줄여보았다. 속도는 Java 코드를 그대로 옮긴 것이 가장 빨랐고 나머지는 비슷했다. 그 후에 다른 사람의 풀이를 보다가 마음에 드는 코드를 발견했다!

const solution = (bridgeLength, weight, truckWeights) => {
    const progress = [];
    let i = 1;
    
    while(true) {
        progress.map((item, j) => {
            if(item.end === i) progress.splice(j, 1);
        });
        
        if(progress.reduce((p, c) => p + c.weight, 0) + truckWeights[0] <= weight) {
            progress.push({ end: i + bridgeLength, weight: truckWeights.shift()});
        }
        
        if(!progress.length && !truckWeights.length) break;
        i += 1;
  }

  return i;
};
  • 우선 배열을 반복문으로 순회하는 동안 배열을 편집하는 것을 금기시여겼는데 map을 이용하면 가능하다는 것을 알게되었다. 요약하자면 다음과 같다. MDN Array.prototype.map()
    • map이 시작한 이후 추가된 요소들은 callback을 호출하지 않는다.
    • 요소의 값이 바뀐 경우 map이 방문하는 시점의 값이 callback에 전달된다.
    • map이 시작되고, 방문하기 전에 삭제된 요소들은 방문하지 않는다.
  • 작업 큐에 요소를 넣을 때 끝나는 시점을 계산해 넣으면 지속적인 업데이트가 필요없다.
    • 굉장히 유용한 아이디어다...
  • 총 무게를 reduce를 사용해서 누적합을 구하는 것은 굳이 필요한가 싶지만 reduce를 사용한다는 것에 의의가 있는 것 같다. 나도 사용하려고 노력해봐야겠다.

구현코드

function solution(bridge_length, weight, truck_weights) {
    const bridge = [];
    let total_weight = 0;
    let time = 0;
        
    while(bridge.length || truck_weights.length){    
        if(bridge.length && bridge[0].pos == bridge_length) {
            total_weight -= bridge.shift().weight;
        }
        
        bridge.map(item => {
            item.pos++;
        });
                
        if(total_weight + truck_weights[0] <= weight){
            bridge.push({
                pos: 1,
                weight: truck_weights[0]
            });
            total_weight += truck_weights.shift();
        }
        time++;
    }
    return time;
}
profile
그냥 개발자

0개의 댓글