티스토리 뷰

반응형

 

 

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

 

문제는 위 링크에서 볼 수 있다. 문제에 대한 해설보다는 기억하고 싶은 개념, 사고, 문법을 기록하는 글이다. 

답안은 맨 아래에 표기해 두었다.

 

 


 

구현 능력 

너무나 대놓고 큐(queue)의 개념을 활용하면 되는 문제였다. 

문제를 몇개 안 풀어 봤지만 보통 for문보다는 while문을 더 활용하는 것 같다. 

큐(queue)문제는 shift()와 push()를 활용하면 좋다. 

 

이 문제를 풀 때 처음에 지나간 트럭을 passedTruck이라는 변수에 담았는데, 생각해보니 지나간 트럭을 담을 필요가 없었고, 

그냥 몇 초가 걸리는지만 변수에 숫자를 담아 증가시키면 되는 문제였다. 

 

코드를 작성하고 불필요한 것은 없는지 더 생각해봐야겠다. 

 

 


 

기억하기

 

1. fill() 메서드로 배열에 특정 값 채워넣기 

ES6에 도입된 메서드이다. 인수로 전달받은 값을 배열의 처음부터 끝까지 요소로 채운다. 이 때 원본 배열이 변경된다. 

이전 백준에서 알고리즘 풀었을 때 자주 사용하던 방식이다.

 

 let bridge = Array(2).fill(0);
 
 // bridge = [0, 0]

 

fill() 기존에 있는 배열의 원소를 바꿀 수도 있다는 점을 알아두자. 

 

const arr = [1, 2, 3];

// 인수로 전달 받은 값 0을 배열의 index 1부터 끝까지 요소로 채운다.
arr.fill(0, 1);

// arr = [1, 0, 0]

// 만약 arr.fill(0); 을 하면 arr = [ 0, 0, 0 ]으로 변경될 것이다.

 


 

2.  reduce() 메서드로 배열의 합계 구하기 

다리 위에 올라간 트럭 무게의 합을 구할 때 reduce()로 구현했다. 

문제는 reduce()를 써야한다는 것은 알았지만,  백지의 상태에서 쓰려니 까먹어서 결국 어떤식으로 쓰는지 또 찾아봤다. 

 

reduce()작동방식 - mdn

 

reduce()에서 초기값은 생략 가능하다. 쓰지 않으면 배열의 첫 번 째 원소를 가져다 쓰기 때문이다.

그러니 당연하게도 비어있는 배열에서 reduce()쓰면 타입에러가 발생한다. 이러한 오류를 줄이기 위해서 초기값은 항상 전달하는 편이 더 안전하다.

 

let sum = bridge.reduce((pre, curr) => pre + curr, 0);

 

내 코드의 경우 위에서 bridge에 초기값으로 이미 배열에 0을 할당한 상태이다. 그래서 reduce()에 초기값을 설정해주지 않으면 배열의 첫번째 원소를 사용하기 때문에 오류가 나지 않는다. 

let bridge = Array(bridge_length).fill(0);
// bridge = [0, 0]

 

만약 fill(0)을 하지 않았다면? 

초기값이 없는 빈 배열이라는 오류를 볼 수 있다. 

let bridge = Array(bridge_length);
// bridge = []

let sum = bridge.reduce((pre, curr) => pre + curr);
// TypeError: Reduce of empty array with no initial value

 

 


 

답안

function solution(bridge_length, weight, truck_weights) {
  let bridge = Array(bridge_length).fill(0);

  let time = 0;

  while (bridge.length) {
    bridge.shift();
    time += 1;

    if (truck_weights.length) {
        let sum = bridge.reduce((pre, curr) => pre + curr, 0);
      if (sum + truck_weights[0] <= weight) {
        bridge.push(truck_weights.shift());
      } else {
        bridge.push(0);
      }
    }
  }
  return time;
}

 

 

반응형