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

Song-Minhyung·2022년 7월 3일
0

Problem Solving

목록 보기
16/50
post-thumbnail

문제

https://programmers.co.kr/learn/courses/30/lessons/42583?language=javascript
다리를 지나려고 기다리고 있는 트럭이 여러대 있다.
그 트럭의 무게는 전부 다른데 다리의 길이와 버틸 수 있는 무게는 한정돼 있다.
이 때 다리가 버틸 수 있는 무게, 길이를 초과하지 않으면서 트럭이 지나갈 때의 시간을 구하는 문제다.

입력: [ bridge_length, weight, truck_weights ]

  • bridge_length: 1 이상 10,000 이하의 자연수
  • weight: 1 이상 10,000 이하의 자연수
  • truck_weights: 1 이상 10,000 이하의 배열길이
    • 각 요소(트럭)는 1이상 weight 이하의 자연수의 무게를 가짐

출력: 소요되는 시간을 출력

풀이방법

큐를 쓰면 간단하게 풀 수 있는 문제다.
문제를 봤을 때 어떻게 구현해야 할지는 대충 감이 왔다.
근데 대충 감만 와서 푸는데 시간이 꽤 걸렸다.

처음에는 이렇게 생각했다.

  1. 트럭이 건너는 중에는 무게를 초과하면 다른 트럭이 올 수 없음.
  2. 무게가 넘지 않으면 트럭이 들어올 수 있는만큼 들어옴
  3. 무게가 넘으면 다리가 비어있고 && 무게가 넘지 않을 때 까지 기다림.
  4. 시간은 계속 지남

근데 어떻게 구현하면 좋을지 모르겠어서 트럭이 지나가는 모습을 상상했다.
다리길이는 총 4, 버틸 수 있는 무게도 4이고, 트럭은 무게1이 4대가 있는 모습을 상상하면 이렇다.

트럭의 진행방향은 ⬅️ 이쪽이다.

0: 0 0 0 0
1: 0 0 0 1
2: 0 0 1 1
3: 0 1 1 1
4: 1 1 1 1
5: 1 1 1 0
6: 1 1 0 0
7: 1 0 0 0
8: 0 0 0 0

이제 순서를 보면 이렇다.

  1. 조건을 충족하면 다리위로 올라온다.
  2. 차가 다리위로 올라오기 전 끝에서 나간다.
  3. time은 계속 1씩 증가한다.

이제 이걸 코드로 옮기기만 하면 된다.

전체코드

function solution(bridge_length, maxWeight, weights) {
    const onBridge = Array(bridge_length).fill(0);
    let totWeight = 0;
    let time = 0;
	
  	// 다리위에 트럭이 있거나 대기줄이 존재한다면 while문을 실행한다.
    while(totWeight > 0 || weights.length > 0) {
        totWeight -= onBridge.shift();

        if (totWeight + weights[0] <= maxWeight){
            onBridge.push(weights[0]);
            totWeight += weights.shift();
        }else {
            onBridge.push(0);
        }

        time++;
    } 
    return time;
}

소요시간

앞으로 얼마나 실력이 향상됐는지 파악하고싶어서 소요시간도 같이 적어줄 생각이다.
이번 문제는 2시간이 소요됐다.

profile
기록하는 블로그

0개의 댓글