본문 바로가기

algorithm/프로그래머스

프로그래머스_다리를 지나는 트럭(JAVA)

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

 

프로그래머스

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

programmers.co.kr

[문제 풀이]

큐를 이용하여 문제를 해결하였습니다.

 

문제에서 구하고자 하는 것은 트럭이 순서대로 들어 대기하고 있고 다리의 길이와 허용 무게가 정해져 있을 때, 걸리는 최소 시간을 구하는 문제입니다. 다리의 올라와 있는 트럭의 수와 무게를 비교하며 시간이 흐름에 따라 변하는 것을 큐를 이용하여 구현했습니다.

 

구현한 방식은 아래와 같습니다.

  1. 먼저 트럭 배열을 순회합니다.
  2. 트럭 배열을 순회하며 4가지 조건을 계속 비교하며, 선택 된 트럭이 큐(다리)에 더해지는 순간을 찾습니다. 트럭이 다리에 올라가면 시간을 +1 해줍니다.
  3. 큐에 원소가 하나도 없다면 큐에 트럭을 넣어하고 현재 무게를 초기화 하며 시간을 +1 해줍니다.
  4. 큐의 크기가 다리 길이의 크기와 같다면 큐에서 원소를 꺼냅니다.
  5. 현재 무게와 트럭 원소의 값을 더한 무게가 견딜 수 있는 무게 보다 작다면 큐에 원소를 넣어주고 현재 무게에 트럭의 무게를 더해주며 시간을 +1 해주고 다음 트럭을 비교합니다.
  6. 현재 무게와 트럭 원소의 값을 더한 무게가 견딜 수 있는 무게 보다 크다면 큐에 0을 넣어줍니다. 

[JAVA]

import java.util.LinkedList;
import java.util.Queue;

class Solution{
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int answer = 0;
        
        Queue<Integer> que = new LinkedList<>();
        int current_weight = 0;
       
        for(int item : truck_weights) {
        	
        	while(true) {
        		if(que.isEmpty()) {
        			que.add(item);
        			current_weight = item;
        			answer++;
        			break;
        		}
        		else if(que.size() == bridge_length) {
        			current_weight -= que.poll();
        		}else {
        			if(current_weight + item <= weight) {
        				que.add(item);
        				current_weight += item;
        				answer++;
        				break;
        			}else {
        				que.add(0);
        				answer++;
        			}
        		}
        	}
        }
        
        return answer + bridge_length;
        
    }
}