티스토리 뷰

https://school.programmers.co.kr/learn/courses/30/lessons/42583

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

🤔 해결방법

1. 길이가 bridge_length이고 0으로 채워진 다리 bridge 생성 후 shift
2. 현재 bridge에 있는 모든 숫자와 truck_weights의 첫번째 숫자의 합이 weight보다 작거나 같으면 트럭 추가와 time++, 아니면 0 추가와 time++

3. 대기 트럭이 없을 때까지 2번의 과정을 반복

 

 

🔑 풀이

대기 트럭을 앞에서부터 순서대로 꺼내야하므로 큐를 사용해 풀어야 했다.

먼저 길이가 bridge_length이고 0으로 채워진 다리 bridge (queue)를 생성한다.
이 다리에 트럭이 하나씩 들어가게 해줘야 한다.

이를 위해 현재 bridge에 있는 모든 숫자와 truck_weights의 첫번째 숫자의 합을 weight와 비교한다.

weight보다 작거나 같으면 트럭을 하나 꺼내 다리에 넣어주고 경과 시간 +1 도 해준다.

그렇지 않으면 0을 넣어주고 경과 시간 +1 을 해주면 된다.

이 과정까지 반복하면 문제에서 주어진 예시에서는 time이 6이 나오는데 답은 8이다.

모든 트럭이 다리를 다 지나갈 때까지의 시간을 계산해야 하는데 마지막 트럭이 다리에 진입하는 시점에서 반복문이 종료되어 버리기 때문이었다..!😮

따라서 다리 길이 만큼의 시간을 추가로 더해주어야 한다.

function solution(bridge_length, weight, truck_weights) {
    let bridge = Array(bridge_length).fill(0); // 다리
    let time = 0; // 경과 시간

    // 대기 트럭이 없을 때까지
    while (truck_weights.length) {
      bridge.shift();

      // 현재 bridge 위의 트럭 무게와 다음 트럭의 무게 합이 weight보다 작거나 같으면
      if (bridge.reduce((a, b) => a + b) + truck_weights[0] <= weight) {
        bridge.push(truck_weights.shift());
        time++;
      } else {
        bridge.push(0);
        time++;
      }
    }

    return time + bridge_length;
  }

마지막에 다리 길이를 더해주는 걸 생각치 못해 시간을 꽤 허비했다.😅

중학생 과외할 때 풀던 비슷한 개념의 문제가 생각났다.

기차가 터널을 완전히 통과하기까지 걸리는 시간을 구하는 문제였는데 이 문제에서도 기차가 움직인 총 길이는 기차 길이 + 터널 길이이다. 기억하자!

출처 : https://blog.naver.com/nowedu1/220407753355

 

 

댓글