오늘 풀어본 문제는 페어코딩을 하기위한 문제였지만,,
야근을 하는 바람에 혼자 풀어본 문제가 되었다,,😂
알고리즘 분류는 스택/큐 이며,
다리의 길이(bridge_length), 다리가 견딜 수 있는 무게(weight), 트럭의 무게(truck_weights)를 가지고 모든 트럭이 다리를 건너기까지 걸린 시간을 출력하는 문제였다.
내가 풀면서 살짝 설명이 부족하다고 생각했던 부분은 bridge_length의 1만큼 지날 때 시간이 1만큼 걸린다는 점이었다.
이 부분까지 확인하고 문제를 풀어보았다.
public int solution(int bridge_length, int weight, int[] truck_weights) { int answer = 0; Queue<Integer> queue = new LinkedList<>(); int sum = 0; for(int i=0; i<truck_weights.length; i++) { while (true) { if(queue.isEmpty()){ queue.offer(truck_weights[i]); answer++; sum += truck_weights[i]; break; }else if(queue.size() == bridge_length){ sum -= queue.poll(); }else{ if(sum + truck_weights[i] > weight){ queue.offer(0); answer++; }else{ queue.offer(truck_weights[i]); answer++; sum += truck_weights[i]; break; } } } } return answer + bridge_length; }
처음에 생각했던 방법은 queue의 크기를 bridge_length로 지정해두고 구현하는 방법을 생각했었는데,,
검색해보니 CircularQueue, EvictingQueue 를 이용해서 풀 수 있다고 하던데,, Apache Commons, Google Guava 와 같은 라이브러리? 를 사용해야 하는 방법이라 포기하고,
큐의 크기를 지정해주는 클래스를 별도로 만들어서 사용하려 하였으나 생각대로 구현이 안돼서 포기하였다😂
결국은 조건문을 이용해서 풀었는데
큐를 다리라고 생각하고 큐가 비어있을 때 트럭을 넣고, 큐에 올라간 트럭의 무게를 int형 변수 sum으로 계산해서
sum이 주어진 weight보다 큰 경우에는 0을 넣어서 다음 트럭이 올라가지 않도록 구현해주었다.
추가로 큐의 크기가 bridge_length와 같을 땐, poll을 해주면서 그 값만큼 sum에서 빠질 수 있도록 구현해주었다.