반응형

문제 설명
초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.

제한사항
prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
prices의 길이는 2 이상 100,000 이하입니다.

 

입출력 예
prices              return
[1, 2, 3, 2, 3]   [4, 3, 1, 1, 0]


입출력 예 설명
1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다.
2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다.
3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다.
4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다.
5초 시점의 ₩3은 0초간 가격이 떨어지지 않았습니다.

 

처음 문제풀었는 방식은 아래와 같았습니다.

class Solution {
    public int[] solution(int[] prices) {
        int[] answer = new int[prices.length];
        for(int i=0; i<prices.length; i++){
            for(int j=i+1; j<prices.length; j++){
                if(prices[i] <= prices[j]){
                    answer[i]++;
                }
            }
        }
        return answer;
    }
}

이 문제를 보면서 문제를 조금 끝까지 보자라는 생각을 했습니다.

1초 시점에서 다음으로 넘어가는 그 순간을 1초라고 생각을 했지만

 

첫 풀이에서는 [가격이 떨어지지 않은 기간] 이것을 이후 시간 동안 떨어지지 않은 총합으로 생각해서 문제를 풀었더니 채점 문제에서 1번 문제만 성공하고 전부 틀리는 문제가 발생했습니다.

 

그러고 이후에 문제를 다시 한번 보니까

3초 시점에서 1초되에 가격이 떨어진다. 따라서 1초간 가격이 떨어지지 않았다 라는 문구를 보게되니

떨어진 시점 까지의 소비시간이 문제에서 요구하는 [ 가격이 떨어지지 않은 기간 ] 이었던것을 인지하고 다시한번 풀었더니 문제없이 통과가 가능해 졌다.

 

class Solution {
    public int[] solution(int[] prices) {
        int[] answer = new int[prices.length];
        for(int i=0; i<prices.length; i++){
            for(int j=i+1; j<prices.length; j++){
                answer[i]++;
                if(prices[i] <= prices[j]){
                }else{
                    break;
                }
            }
        }
        return answer;
    }
}
반응형
반응형

트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈 수 있으며, 다리는 weight 이하까지의 무게를 견딜 수 있습니다. 단, 다리에 완전히 오르지 않은 트럭의 무게는 무시합니다.

예를 들어, 트럭 2대가 올라갈 수 있고 무게를 10kg까지 견디는 다리가 있습니다. 무게가 [7, 4, 5, 6]kg인 트럭이 순서대로 최단 시간 안에 다리를 건너려면 다음과 같이 건너야 합니다.

경과 시간 다리를 지난 트럭 다리를 건너는 트럭 대기 트럭
0 [] [] [7,4,5,6]
1~2 [] [7] [4,5,6]
3 [7] [4] [5,6]
4 [7] [4,5] [6]
5 [7,4] [5] [6]
6~7 [7,4,5] [6] []
8 [7,4,5,6] [] []

따라서, 모든 트럭이 다리를 지나려면 최소 8초가 걸립니다.

solution 함수의 매개변수로 다리에 올라갈 수 있는 트럭 수 bridge_length, 다리가 견딜 수 있는 무게 weight, 트럭 별 무게 truck_weights가 주어집니다. 이때 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 return 하도록 solution 함수를 완성하세요.

제한 조건
bridge_length는 1 이상 10,000 이하입니다.
weight는 1 이상 10,000 이하입니다.
truck_weights의 길이는 1 이상 10,000 이하입니다.
모든 트럭의 무게는 1 이상 weight 이하입니다.

 

입출력 예

bridge_length weight truck_weights return
2 10 [7,4,5,6] 8
100 100 [10] 101
100 100 [10,10,10,10,10,10,10,10,10,10] 110

 

위의 문제를 보고 가장 먼저 들었는 생각은 경과 시간과 다리를 건너는 트럭의 존재였습니다.

한 사이클이 동작하는 도중마다 시간을 측정해서 다리를 건너는 트럭이 존재하지 않을때 까지 측정하게되면 되지 않을까? 라는 생각으로 문제를 풀어 보았습니다.

 

import java.util.*;
class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        Queue<Integer> trucks = new LinkedList<>();
        Queue<Integer> bridge_len = new LinkedList<>();
        int trucks_len = truck_weights.length;

        // 초기화
        int sum_weights = truck_weights[0];
        trucks.add(truck_weights[0]);
        bridge_len.add(1);
        int cnt = 1;
        int answer = 1;
        
        // 처리 시작
        while(trucks.size() != 0){
        	// 동작 시간을 계속 측정
            answer++;
            // 맨앞에 있는 트럭의 도착여부
            if(bridge_len.peek() == bridge_length){
                sum_weights -= trucks.poll();
                bridge_len.poll();
            }
            // 트럭들의 움직임
            for(int i=0; i<trucks.size(); i++){
                trucks.add(trucks.poll());
                bridge_len.add(bridge_len.poll() + 1);
            }
            // 다리위로 트럭이 추가로 지나갈수 있는지 판단
            if(cnt < trucks_len){
                if(sum_weights + truck_weights[cnt] <= weight){
                    sum_weights += truck_weights[cnt];
                    trucks.add(truck_weights[cnt]);
                    bridge_len.add(1);
                    cnt++;
                }
            }
        }
        return answer;
    }
    
}

초기화를 하는 이유는 가장 주의깊게 보고있는 부분 [다리를 건너는 트럭] 의 존재 여부를 가장 중요하게 보고 있기 때문에 첫번째 트럭이 지나가기 전까지는 다리를 건너는 트럭이 존재하지 않기 때문에 조건에도 최소한의 길이가 표시되어 있기 때문에 그것을 활용해서 초기화를 시켜주었습니다.

반응형
반응형

트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈 수 있으며, 다리는 weight 이하까지의 무게를 견딜 수 있습니다. 단, 다리에 완전히 오르지 않은 트럭의 무게는 무시합니다.

예를 들어, 트럭 2대가 올라갈 수 있고 무게를 10kg까지 견디는 다리가 있습니다. 무게가 [7, 4, 5, 6]kg인 트럭이 순서대로 최단 시간 안에 다리를 건너려면 다음과 같이 건너야 합니다.

경과 시간 다리를 지난 트럭 다리를 건너는 트럭 대기 트럭
0 [] [] [7,4,5,6]
1~2 [] [7] [4,5,6]
3 [7] [4] [5,6]
4 [7] [4,5] [6]
5 [7,4] [5] [6]
6~7 [7,4,5] [6] []
8 [7,4,5,6] [] []

따라서, 모든 트럭이 다리를 지나려면 최소 8초가 걸립니다.

solution 함수의 매개변수로 다리에 올라갈 수 있는 트럭 수 bridge_length, 다리가 견딜 수 있는 무게 weight, 트럭 별 무게 truck_weights가 주어집니다. 이때 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 return 하도록 solution 함수를 완성하세요.

제한 조건
bridge_length는 1 이상 10,000 이하입니다.
weight는 1 이상 10,000 이하입니다.
truck_weights의 길이는 1 이상 10,000 이하입니다.
모든 트럭의 무게는 1 이상 weight 이하입니다.

 

입출력 예

bridge_length weight truck_weights return
2 10 [7,4,5,6] 8
100 100 [10] 101
100 100 [10,10,10,10,10,10,10,10,10,10] 110

 

위의 문제를 보고 가장 먼저 들었는 생각은 경과 시간과 다리를 건너는 트럭의 존재였습니다.

한 사이클이 동작하는 도중마다 시간을 측정해서 다리를 건너는 트럭이 존재하지 않을때 까지 측정하게되면 되지 않을까? 라는 생각으로 문제를 풀어 보았습니다.

 

import java.util.*;
class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        Queue<Integer> trucks = new LinkedList<>();
        Queue<Integer> bridge_len = new LinkedList<>();
        int trucks_len = truck_weights.length;

        // 초기화
        int sum_weights = truck_weights[0];
        trucks.add(truck_weights[0]);
        bridge_len.add(1);
        int cnt = 1;
        int answer = 1;
        
        // 처리 시작
        while(trucks.size() != 0){
        	// 동작 시간을 계속 측정
            answer++;
            // 맨앞에 있는 트럭의 도착여부
            if(bridge_len.peek() == bridge_length){
                sum_weights -= trucks.poll();
                bridge_len.poll();
            }
            // 트럭들의 움직임
            for(int i=0; i<trucks.size(); i++){
                trucks.add(trucks.poll());
                bridge_len.add(bridge_len.poll() + 1);
            }
            // 다리위로 트럭이 추가로 지나갈수 있는지 판단
            if(cnt < trucks_len){
                if(sum_weights + truck_weights[cnt] <= weight){
                    sum_weights += truck_weights[cnt];
                    trucks.add(truck_weights[cnt]);
                    bridge_len.add(1);
                    cnt++;
                }
            }
        }
        return answer;
    }
    
}

초기화를 하는 이유는 가장 주의깊게 보고있는 부분 [다리를 건너는 트럭] 의 존재 여부를 가장 중요하게 보고 있기 때문에 첫번째 트럭이 지나가기 전까지는 다리를 건너는 트럭이 존재하지 않기 때문에 조건에도 최소한의 길이가 표시되어 있기 때문에 그것을 활용해서 초기화를 시켜주었습니다.

반응형
반응형

운영체제의 역할 중 하나는 컴퓨터 시스템의 자원을 효율적으로 관리하는 것입니다. 이 문제에서는 운영체제가 다음 규칙에 따라 프로세스를 관리할 경우 특정 프로세스가 몇 번째로 실행되는지 알아내면 됩니다.

1. 실행 대기 큐(Queue)에서 대기중인 프로세스 하나를 꺼냅니다.
2. 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣습니다.
3. 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다.
  3.1 한 번 실행한 프로세스는 다시 큐에 넣지 않고 그대로 종료됩니다.
예를 들어 프로세스 4개 [A, B, C, D]가 순서대로 실행 대기 큐에 들어있고, 우선순위가 [2, 1, 3, 2]라면 [C, D, A, B] 순으로 실행하게 됩니다.

현재 실행 대기 큐(Queue)에 있는 프로세스의 중요도가 순서대로 담긴 배열 priorities와, 몇 번째로 실행되는지 알고싶은 프로세스의 위치를 알려주는 location이 매개변수로 주어질 때, 해당 프로세스가 몇 번째로 실행되는지 return 하도록 solution 함수를 작성해주세요.

제한사항
priorities의 길이는 1 이상 100 이하입니다.
priorities의 원소는 1 이상 9 이하의 정수입니다.
priorities의 원소는 우선순위를 나타내며 숫자가 클 수록 우선순위가 높습니다.
location은 0 이상 (대기 큐에 있는 프로세스 수 - 1) 이하의 값을 가집니다.
priorities의 가장 앞에 있으면 0, 두 번째에 있으면 1 … 과 같이 표현합니다.

 

입출력 예

priorities location return
[2, 1, 3, 2] 2 1
[1, 1, 9, 1, 1, 1] 0 5

입출력 예 설명
예제 #1

문제에 나온 예와 같습니다.

예제 #2


6개의 프로세스 [A, B, C, D, E, F]가 대기 큐에 있고 중요도가 [1, 1, 9, 1, 1, 1] 이므로 [C, D, E, F, A, B] 순으로 실행됩니다. 따라서 A는 5번째로 실행됩니다.

 

import java.util.*;
class Solution {
    public int solution(int[] priorities, int location) {
        int answer = priorities.length;
        int num = 0;
        Queue<Integer> queue = new LinkedList<>();
        for(int prioritie: priorities){
            queue.add(prioritie);
        }
        
        while(location != -1){
            num = queue.poll();
            location--;
            
            for(int i=num+1; i<=9; i++){
                if(queue.contains(i)){
                    queue.add(num);
                    if(location == -1){
                        location = queue.size()-1;
                    }
                    break;
                }
            }
        }
        return answer-queue.size();
    }
}

location에 대한 위치를 대상으로 대상 위치를 파악하고 있으니까 그것을 최대한 활용해 보자는 의미로 location을 조작을 해서 위치를 파악을 하면서 문제를 풀었습니다.

반응형

+ Recent posts