쥬로그

Programmers 코딩테스트 고득점 Kit - 스택/큐 본문

Algorithm/Programmers

Programmers 코딩테스트 고득점 Kit - 스택/큐

쥬쥬씨 2022. 6. 2. 13:22
반응형

 

 

프로그래머스

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

programmers.co.kr

 

기능개발
import java.util.*;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {        
        List<Integer> list = new ArrayList<>();
        int[] day = new int[progresses.length];
        
        for(int i = 0; i < progresses.length; i++){
            day[i] = (100 - progresses[i]) / speeds[i];
            if((100 - progresses[i]) % speeds[i] != 0){
                day[i] += 1;
            }
        }
        
        int prev = day[0];
        int count = 1;
        for(int i = 1; i < day.length; i++){
            if(prev < day[i]){
                list.add(count);
                count = 1;
                prev = day[i];
            } else {
                count++;
            }
        }
        list.add(count);
        
        int[] answer = new int[list.size()];
        for(int i = 0; i < list.size(); i++){
            answer[i] = list.get(i);
        }
        
        return answer;
    }
}
import java.util.*;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {        
        Queue<Integer> q = new LinkedList<>();
        List<Integer> answerList = new ArrayList<>();

        for (int i = 0; i < speeds.length; i++) {
        	// System.out.println("for문 index "+i);
            double remain = (100 - progresses[i]) / (double) speeds[i];
            // 나머지가 있을 경우 + 1 day 해야하므로 double로 형변환, Math 올림 함수 사용하여 date 계산
            int date = (int) Math.ceil(remain);

            if (!q.isEmpty() && q.peek() < date) {
            	// System.out.println("if문 1 "+q.peek());
                // queue에 date가 들어있을 경우 값 비교 후 계산한 date보다 작으면
                // list에 개수 추가, 큐 비우기 
                answerList.add(q.size());
                q.clear();
                // System.out.println("if문 2 "+q.peek());
            }
            // 큐가 비워져 있는 경우 큐에 date 추가하기
            q.offer(date);
            // Iterator iter = q.iterator();
            // while(iter.hasNext()) {
            // 	System.out.println(i + "번째 que 전체" + iter.next());
            // }
            
        }

        answerList.add(q.size());

        int[] answer = new int[answerList.size()];

        for (int i = 0; i < answer.length; i++) {
            answer[i] = answerList.get(i);
        }
        return answer;
    }
}

 

 

프린터
import java.util.*;
class Solution {
    class Task{
        int location;
        int priority;
        
        public Task(int location, int priority){
            this.location = location;
            this.priority = priority;
        }
    }
    public int solution(int[] priorities, int location) {
        int answer = 0;
        
        Queue<Task> task = new LinkedList<>();
        for(int i = 0; i < priorities.length; i++){
            task.add(new Task(i, priorities[i]));
        }
        
        int now = 0; 
        while(!task.isEmpty()){
            // 큐 맨 앞에 있는 task 꺼내서 cur에 저장
            Task cur = task.poll();
            boolean flag = false;
            for(Task t : task){
                // cur의 priority와 큐의 priority 비교
                if(t.priority > cur.priority){
                    flag = true;
                }
            }
            if(flag){ // 현재 priority보다 큐 맨 앞에 있는 priority가 클 때 cur를 task 뒤에 추가하기
                task.add(cur);
            } else { // 현재 priority가 큐 맨 앞에 있는 priority보다 클 때 now++
                now++;
                // cur의 location이 location가 동일하면 now 출력하기
                if(cur.location == location){
                    answer = now;
                    break;
                }
            }
        }
        return answer;
    }
}
	public int solution(int[] priorities, int location) {
        int answer = 0;
        int l = location;

        Queue<Integer> que = new LinkedList<Integer>();
        for(int i : priorities){
            // que에 priorities 값 넣기
            que.add(i);
        }

        Arrays.sort(priorities); // priorities 오름차순 정렬
        int size = priorities.length-1; // 가장 우선순위 높은 index



        while(!que.isEmpty()){
            Integer i = que.poll(); // 처음 값 꺼내기
            if(i == priorities[size - answer]){ // i와 우선순위 높은 값 비교
                answer++;
                l--;
                if(l <0)
                    break;
            }else{
                que.add(i);
                l--;
                if(l<0)
                    l=que.size()-1;
            }
        }

        return answer;
    }

 

 

다리를 지나는 트럭
import java.util.*;
class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        
        Queue<Integer> que = new LinkedList<>();
        
        int tol = 0;
        int time = 0;
        for(Integer truck : truck_weights){
            while(true){
                if(que.isEmpty()){
                    // 다리에 트럭이 한 대도 없을 때
                    que.add(truck);
                    tol += truck;
                    time++;
                    break; // 여기서 끊어줘야 next index로 for문 돌릴 수 있음
                } else if(que.size() == bridge_length){
                    tol -= que.poll();
                } else {
                    if(tol + truck <= weight){
                        que.add(truck);
                        tol += truck;
                        time++;
                        break;
                    } else {
                        que.add(0);
                        time++;
                    }
                }
            }
        }
        
        return time + bridge_length;
    }
}
import java.util.*;
class Solution {
	class Truck {
            int weight;
            int move;

            public Truck(int weight) {
                this.weight = weight;
                this.move = 1;
            }

            public void moving() {
                move++;
            }
        }

        public int solution(int bridgeLength, int weight, int[] truckWeights) {
            Queue<Truck> waitQ = new LinkedList<>();
            Queue<Truck> moveQ = new LinkedList<>();

            for (int t : truckWeights) {
                waitQ.offer(new Truck(t));
            }

            int answer = 0;
            int curWeight = 0;

            while (!waitQ.isEmpty() || !moveQ.isEmpty()) {
                answer++;

                if (moveQ.isEmpty()) {
                    Truck t = waitQ.poll();
                    curWeight += t.weight;
                    moveQ.offer(t);
                    continue;
                }

                for (Truck t : moveQ) {
                    t.moving();
                }

                if (moveQ.peek().move > bridgeLength) {
                    Truck t = moveQ.poll();
                    curWeight -= t.weight;
                }

                if (!waitQ.isEmpty() && curWeight + waitQ.peek().weight <= weight) {
                    Truck t = waitQ.poll();
                    curWeight += t.weight;
                    moveQ.offer(t);
                }
            }

            return answer;
        }
}

 

 

주식가격
import java.util.*;
class Solution {
        
    public int[] solution(int[] prices) {
        int[] ans = new int[prices.length];
        Stack<Integer> stack = new Stack();

        for (int i = 0; i < prices.length; i++) {
            while (!stack.isEmpty() && prices[i] < prices[stack.peek()]) {
            	// System.out.println("stack.peek "+stack.peek() + " prices[i] " + prices[i]);
                ans[stack.peek()] = i - stack.peek();
                stack.pop(); // 답을 구했기 때문에 stack에서 제거한다
            }
            stack.push(i);
        }

        while (!stack.isEmpty()) { // 값을 구하지 못한 index == 끝까지 가격이 떨어지지 않은 주식
            ans[stack.peek()] = prices.length - stack.peek() - 1;
            stack.pop();
        }

        return ans;
    }
}
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; j < prices.length; j++){
                answer[i]++;
                if(prices[i] > prices[j]){
                    break;
                }
            } // end j for문
        } //end i for문
    }
}

 

반응형