ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 스택/큐 - 다리를 지나는 트럭
    알고리즘 공부/문제 풀이 2020. 8. 11. 00:31

    문제의 "순서가 있는 트럭"이라는 말에서 를 떠올렸다.

     

    큐를 이용해서 구현해야지 까지... 생각하고 여러 가지 방안을 생각해보았는데 

    특정한 경우에만 적합한 방법이라는 것을 알았다.

     

    문제의 예시에서도 그렇고, 내가 손으로 생각해 볼때도 계속 시간당 bridge가 어떻게 될까를 생각하며 고민하였다.

    그래서 결과 중심으로 문제를 푸는 것이 아닌 시간 단위의 과정으로 bridge 상태를 고려하며 풀어야겠다고 생각했다.

     

    따라서 현재 bridge를 나타내는 변수를 만들었다. 

    bridge의 크기는 문제에서 주어지는 bridge_length이고, 1초가 지날 때마다 배열의 값이 한 칸씩 왼쪽으로 이동하게 된다.

     

    다리 위에 놓인 트럭의 무게 합이 다리가 버티는 weight보다 작은 경우 큐에서 값을 꺼내와 bridge위에 올리고

    큐가 빌 때까지 위 과정을 반복한다.

     

    마지막으로 bridge 배열에 올라간 변수는 bridge_length 초만큼 시간이 흐른 후에 다리를 건널 수 있다.

     

    	static int solution(int bridge_length, int weight, int[] truck_weights) {
            int answer = 0;
     
            Queue<Integer> q=new LinkedList<Integer>();
            int[] bridge=new int[bridge_length];
            int sum=0;
            
            for(int i=0;i<truck_weights.length;i++) q.offer(truck_weights[i]);
            
            while(!q.isEmpty()) {
            	// 조건을 만족한다면, 큐에서 값을 꺼내 bridge 배열의 마지막에 놓는다.
            	if(sum + q.peek() <= weight) {
            		bridge[bridge_length-1]=q.poll();
            	}
            	
            	// 매타임마다 sum 새로 계산, 1초당 answer 1증가
            	sum=0;
            	answer++;
    
            	//1초마다 왼쪽으로 한칸씩 이동, 배열의 sum을 계산
            	for(int i=0;i<bridge_length-1;i++) {
            		bridge[i]=bridge[i+1];
            		sum+=bridge[i];
            	}
        		bridge[bridge_length-1]=0;
            }
            
            //마지막으로 들어간 변수는 bridge_length초 후에 다리를 건넌다.
            answer += bridge_length;
            
            return answer;
        }

     

    여기서 의문점이..

    중간에 bridge[bridge_length-1]=0; 이라는 부분을 반복문 안에다 써서 계속 값에 오류가 났는데

    이 문장은 반복문에 영향을 받지 않는 문장같은데 왜 오류가 나는지 잘 모르겠다 ㅠㅠ

    댓글

Designed by Tistory.