ygreenb
yellowgreenblue
ygreenb
전체 방문자
오늘
어제
  • TIL (130)
    • Algorithm & Data Structure (70)
      • 이론 (4)
      • 프로그래머스 (54)
      • 백준 (12)
    • JAVA (4)
    • Android Studio (9)
    • Database (1)
    • WEB (25)
      • HTML+CSS (7)
      • Javascript (5)
      • React (11)
      • Django (1)
      • Node.js (1)
    • Computer Vision (13)
    • Git (8)

블로그 메뉴

  • HOME
  • TAG
  • GITHUB

공지사항

인기 글

태그

  • Comparator
  • git
  • 프로그래머스 Lv.2
  • getOrDefault
  • git bash
  • Android
  • 프로그래머스
  • Queue
  • BFS
  • 깃
  • PriorityQueue
  • React
  • 안드로이드
  • reactjs
  • 스택/큐
  • 해시
  • stack
  • greedy
  • Arrays.sort()
  • 깃허브
  • HashMap
  • entrySet
  • kotiln
  • DP
  • 코틀린
  • 백준
  • compareTo()
  • sort
  • dfs
  • java

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ygreenb

yellowgreenblue

Algorithm & Data Structure/프로그래머스

[Java] 프로그래머스 Lv.2 > 다리를 지나는 트럭

2022. 2. 28. 00:20

https://programmers.co.kr/learn/courses/30/lessons/42583?language=java 

 

코딩테스트 연습 - 다리를 지나는 트럭

트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈

programmers.co.kr

 

풀이

스택/큐 문제였다. 트럭이 다리를 건너는 순서대로 빠져나와야하기 때문에 큐를 사용했다.

다리를 의미하는 queue를 만들어주고, 조건에 맞게 트럭을 큐에서 넣고 빼준다.

  • 다리 위 트럭이 없는 경우(맨 처음)에는 트럭을 queue에 넣어준다.
  • 다리 위에 트럭이 다 찬 경우(q.size()== bridge_length) 에는 queue에서 트럭을 빼준다.
  • 다리 위에 트럭이 이미 있는 경우, 현재 대기중인 트럭 포함 무게가 weight 이하일 때만 트럭을 queue에 넣어준다.
  • 트럭 위치 이동을 위해, 트럭을 넣지 않을 때는 queue에 0을 넣어줘 위치이동을 표현한다.
  • 다리 위에서 트럭이 1칸씩 움직일 때마다 시간이 흐르기 때문에, queue.offer() 해줄 때 time++을 해준다.
import java.util.LinkedList;
import java.util.Queue;
class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int time = 0; // 걸린 시간 -> qb에 offer해줄때 증가시킴
        int sum = 0; // 다리 위 트럭 무게
        Queue<Integer> q = new LinkedList<>(); // 다리 위 트럭
        
        for(int truck : truck_weights){
            while(true){
                if(q.isEmpty()){ // 다리 위 트럭 없는 경우
                    q.offer(truck);
                    sum += truck;
                    time++;
                    break;
                }else if(q.size() == bridge_length){ // 다리위에 트럭 다 찬경우
                    sum -= q.poll(); // 트럭 다리에서 빼줌
                }else{
                    // 현재 트럭 포함 sum 무게가 weight이하일 때 다리 위에 올려줌
                    if(sum + truck<=weight){
                        q.offer(truck);
                        sum +=truck;
                        time++;       
                        break;                     
                    }else{
                        q.offer(0); // 트럭 위치이동을 위한 0 넣기
                        time++;
                    }
                }
            } 
        }
        
        return time+bridge_length; // 마지막트럭이 다리길이만큼 지나가는시간 추가
    }
}

 

Truck 클래스 사용

사실 처음에 풀려고 했던 방식인데, Truck 클래스 없이 두 Queue만 만들어서 하다보니, 다리 위 트럭이 여러개 일 때 각 트럭마다 다리를 다 지나가는 타이밍을 잡아 큐에서 빼주는 방법을 알지못해 사용하지 못했다.

이후, Truck 클래스를 만들어 트럭에게 position을 주면 된다는 것을 알게되었다.

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

class Solution {
    static class Truck{
        int position;
        int weight;
        
        public Truck(int weight){
            this.weight = weight;
            this.position=0;
        }
    }
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int time = 0; // 걸린 시간
        int sum = 0; // 다리 위 트럭 무게
        Queue<Truck> qt = new LinkedList<>(); // 대기 트럭
        for(int truck : truck_weights)
            qt.offer(new Truck(truck));
        
        Queue<Truck> qb = new LinkedList<>(); // 다리 위 트럭
        qb.offer(qt.poll()); // 첫번째 대기트럭 올려줌
        sum += qb.peek().weight; // 무게더함
        
        while(!qb.isEmpty()){ // 다리건너는 트럭이 비어있으면 멈춤
            time++;
            // 다리 위 트럭 이동
            for(Truck truck : qb){
                truck.position++;
            }
            
            // 다리 다 건너면 트럭 빼줌
            if(qb.peek().position > bridge_length){
                sum-= qb.poll().weight;
            }
            
            // 다리에 자리 있을 때, 무게가 넘지않으면 새로운 트럭 넣어줌
            if(qt.isEmpty()==false && (sum + qt.peek().weight) <= weight){
                sum += qt.peek().weight;
                qt.peek().position++;
                qb.offer(qt.poll());
            }
        }
        
        return time;
        
    }

}
저작자표시 (새창열림)

'Algorithm & Data Structure > 프로그래머스' 카테고리의 다른 글

[Java] 프로그래머스 Lv.2 > 큰 수 만들기  (0) 2022.02.28
[Java] 프로그래머스 Lv.2 > 기능개발  (0) 2022.02.28
[Java] 프로그래머스 : 숫자 문자열과 영단어  (0) 2022.02.21
[Java] 프로그래머스 : 로또의 최고 순위와 최저 순위  (0) 2022.02.21
[Java] 프로그래머스 : 실패율  (0) 2022.02.20
    'Algorithm & Data Structure/프로그래머스' 카테고리의 다른 글
    • [Java] 프로그래머스 Lv.2 > 큰 수 만들기
    • [Java] 프로그래머스 Lv.2 > 기능개발
    • [Java] 프로그래머스 : 숫자 문자열과 영단어
    • [Java] 프로그래머스 : 로또의 최고 순위와 최저 순위
    ygreenb
    ygreenb
    개발공부기록장

    티스토리툴바