Today
-
Yesterday
-
Total
-
  • 프로그래머스 : 프린터
    코딩테스트 문제 풀이/프로그래머스 2023. 11. 20. 00:01

    문제 설명

    내 코드

    import java.util.*;
    class Solution {
        public int solution(int[] priorities, int location) {
            int answer = 0;
            Queue<int[]> q = new LinkedList();
            for (int i = 0; i < priorities.length; i++) {
                q.offer(new int[]{priorities[i], (location == i) ? 1 : 0});
            }
            
            Arrays.sort(priorities);
            int maxIdx = priorities.length - 1;
            
            while (!q.isEmpty()) {
                int[] get = q.poll();
                
                if (get[0] != priorities[maxIdx]) q.offer(get);
                else {
                    answer++;
                    maxIdx--;
                    
                    if (get[1] == 1) break;
                }
            }
            return answer;
        }
    }

     

    1. 우선순위 목록을 큐에 담는다.

     

    Queue<int[]> q = new LinkedList();
    for (int i = 0; i < priorities.length; i++) {
        if (i == location) q.add(new int[]{priorities[i], 1});
        else               q.add(new int[]{priorities[i], 0});
    }

    형태 : `int[]{ 우선순위, 목표물이면 1 목표물 아니면 0}`

     

    2. 우선순위 목록 배열 정렬

    Arrays.sort(priorities);
    int order = priorities.length - 1;

    우선순위가 높은 순서부터 뽑아야 하기 때문에 정렬.
    내림차순 대신 거꾸로 인덱스방향을 진행하기 위해 order 변수 생성
    -> Arrays.sort()로 내림차순 하려면 배열 새로 만들어야 됨 (int[] -> Integer())

     

    3. 목표물 찾아서 출력

    while (!q.isEmpty()) { 
    // 목표물이 제일 마지막에 출력될수 있기떄문에 큐가 전부 빈 공간이 될때까지 반복
    // 사실 큰 의미가 없는 부분인것 같다. 
    // 왜냐하면 목표물이 제일 마지막에 출력되어도 break문으로 인해 먼저 while이 종료되기 때문이다.
    // 하지만 오류라던가 어떤 불가피한 상황으로 인해서 
    // priority와 location이 매치가 잘못 될 경우도 있지 않을까 하고 생각해보면
    // 큐가 빈 공간이 될때까지 반복하는게 맞는것같다!
    
    	// 목표물인지 확인하기위해 큐에서 뽑아냄
        // 목표물이면 반복문 종료
        // 목표물이 아닌데 우선순위가 높으면 뽑아서 버림
        // 목표물이 아닌데 우선순위가 낮으면 맨 뒤로 다시 입력
        int[] priority = q.poll();
    
        if (priority[0] == priorities[order]) {
            answer++; // 1개 출력이 되었으므로 answer 1 증가
            order--; // 우선순위가 제일 높은게 출력되었으므로 다음 우선순위를 조회하기위해 1 감소 
    
            if (priority[1] == 1) break; // 목표물이면 반복문 멈춤
        } else {
            q.add(priority); // 우선순위가 낮은애라서 맨 뒤로 다시 입력
        }
    }

     

     

    처음 풀어본 날 : 23.03.18

    다시 풀어본

    새로 작성한 날 : 23.03.25 다시 풀어본 날 : 23.03.26, 30

Designed by Tistory / Custom by 얼거스