CS/Algorism

99클럽 코테 스터디 3일차 TIL: [프로그래머스] 다리를 지나는 트럭

olsohee 2024. 5. 22. 15:02

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

 

프로그래머스

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

programmers.co.kr

문제를 딱 보고 큐를 떠올리긴 했지만 효율적인 구현을 떠올리지 못했다. 다리에 올라간 트럭은 다리 길이만큼 다리에 머무르게 되는데, 이를 어떻게 구현하는게 효율적일지 고민하다가 혼자 힘으로 풀지 못했다. 주요 포인트는 다음과 같다.

  • 처음에 다리 길이만큼 0을 넣는다.
  • 그리고 다리에 트럭을 올릴 수 있으면(무게가 가능하면) 올린다. 반면 올릴 수 없으면 트럭대신 0을 올린다.
  • 즉, 큐에는 0이든 트럭이든 다리 길이만큼의 숫자들이 저장된다. 그리고 매초마다 숫자를 빼고 넣으면 트럭이 다리 길이만큼 다리를 건너는 것을 구현할 수 있다.

직접 적어보면서 해보면 매우 간단하다. 아직까지는 혼자 힘으로 이렇게 유연하게 사고하지 못하는 거 같다.

import java.util.*;

class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        
        Queue<Integer> que = new LinkedList<>();
        // 다리 길이만큼 0 삽입
        for (int i = 0; i < bridge_length; i++) {
            que.add(0);
        }
        
        int sec = 0;
        int sum = 0;
        int idx = 0;
        while (!que.isEmpty()) {
            sec++;
            
            // 빼기
            sum -= que.poll();
            
            // 넣기
            if (idx < truck_weights.length) {
                if (sum + truck_weights[idx] <= weight) {
                    que.add(truck_weights[idx]);
                    sum += truck_weights[idx];
                    idx++;
                } else {
                    que.add(0);
                }
            } 
        }
        return sec;
    }
}