코딩테스트연습/프로그래머스

[프로그래머스 - JAVA] 프린터

:)jun 2021. 12. 20. 23:53

https://programmers.co.kr/learn/courses/30/lessons/42587

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

일단 출력물을 Ball이라는 객체로 생각하고 큐에다 다 넣어놓고 차례대로 조건 확인해주면 되겠다.

Ball에는 location과 priority 넣어주고 큐에 들어있는 볼을 빼면서 나와야하는 priority가 나오면 location확인하고 값 확인.

//테스트코드

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

class Quiz2_PrinterTest {

    Quiz2_Printer q;

    @BeforeEach
    void setUp() {
        q = new Quiz2_Printer();
    }

    @Test
    void test1() {
        assertEquals(1, q.solution(new int[]{2, 1, 3, 2}, 2));
    }

    @Test
    void test2() {
        assertEquals(5, q.solution(new int[]{1, 1, 9, 1, 1, 1}, 0));
    }
}


//프로덕션코드


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

public class Quiz2_Printer {
    public int solution(int[] priorities, int location) {

        Queue<Ball> queue = new LinkedList<>();

        for (int i = 0; i < priorities.length; i++) {
            queue.offer(new Ball(i, priorities[i]));
        }

        Arrays.sort(priorities);

        int step = 1;

        while (!queue.isEmpty()) {
            if (queue.peek().priority == priorities[priorities.length - step]) {
                Ball ball = queue.poll();
                if(ball.location == location){
                    return step;
                }
                step++;
                continue;
            }
            queue.add(queue.poll());
        }

        return -1;
    }

    class Ball {
        int location;
        int priority;

        Ball(int location, int priority) {
            this.location = location;
            this.priority = priority;
        }
    }
}

// 성공! 리팩토링하자.

// 프로덕션코드

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

public class Quiz2_Printer {
    public int solution(int[] priorities, int location) {

        Queue<Ball> queue = new LinkedList<>();
        setQueue(priorities, queue);

        Arrays.sort(priorities);

        int step = 1;
        while (!queue.isEmpty()) {
            if (isTopPriority(queue.peek().priority, priorities[priorities.length - step])) {
                Ball ball = queue.poll();
                if (isWhatIWantToPrint(location, ball)) {
                    return step;
                }
                step++;
                continue;
            }
            queue.add(queue.poll());
        }

        return -1;
    }

    private boolean isWhatIWantToPrint(int location, Ball ball) {
        return ball.location == location;
    }

    private boolean isTopPriority(int priority, int priority2) {
        return priority == priority2;
    }

    private void setQueue(int[] priorities, Queue<Ball> queue) {
        for (int i = 0; i < priorities.length; i++) {
            queue.offer(new Ball(i, priorities[i]));
        }
    }

    class Ball {
        int location;
        int priority;

        Ball(int location, int priority) {
            this.location = location;
            this.priority = priority;
        }
    }
}
// 성공!