코딩테스트 - 프로그래머스/JAVA

[프로그래머스 / 스택/큐 / 자바(JAVA)] 프로세스

읁; 2024. 4. 24. 15:08

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42587

 

프로그래머스

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

programmers.co.kr

[ 요약 ]

더보기

시작 시간 : 오후 1시 08분

종료 시간 : 오후 1시 50분

소요 시간(분) : 42분

 

도전 횟수 (제출 횟수) : 1회

로직 및 풀이 참고 여부 : X

 

[ 풀어보기 ]

 

정답 풀이

📌 로직

  1. Quque 객체를 queue를 생성하고, 0부터 priorities.length - 1 까지의 수를 집어넣는다. (프로세스의 이름)
  2. queue가 빌 때까지 반복하는 while문을 생성한다.
    • queue의 가장 상단 값을 꺼내, int top으로 지정한다.
    • top의 우선순위와 quque에 들어가있는 나머지 프로세스의 우선순위를 비교하기 위한 for문을 만든다.
      • 만약 top 보다 우선순위가 높은 프로세스가 있으면,
        top을 quque에 추가하고 해당 for문을 빠져나온다.
    • 우선순위 비교 전 queue의 size와, 비교 후의 queue의 size가
      • 같으면 : 해당 프로세스가 실행되지 않은 것
      • 다르면 : 해당 프로세스가 실행된 것 ( answer ++ )
        • 만약 top과 location이 같으면 answer을 return한다.

 

📌 코드

// PM 1:08 ~ 1:50

import java.util.*;

class Solution {
    public int solution(int[] priorities, int location) {
        int answer = 0;
        
        Queue<Integer> queue = new LinkedList<>();
        for(int i=0; i<priorities.length; i++) {
            queue.add(i);
        }
        
        while(!queue.isEmpty()) {
            // 1. queue의 가장 상단값을 꺼낸다.
            int beforeSize = queue.size();
            int top = queue.poll();
            
            // 2. 전체와 우선순위를 비교한다.
            for(int index : queue) {
                // 만약 top보다 우선순위가 큰 수가 있으면, top을 queue에 추가하고 for문 빠져나오기
                if(priorities[index] > priorities[top]) {
                    queue.add(top);
                    break;
                }
            }
            
            // beforeSize와 현재 queue의 size가 다르다 = 프로세스를 실행했다
            if(beforeSize != queue.size()) {
                answer++;
                if (top == location) return answer;
            }
        }

        return answer;
    }
}

 

📌 채점 결과

정확성  테스트
테스트 1 〉	통과 (1.09ms, 72.7MB)
테스트 2 〉	통과 (1.70ms, 75.8MB)
테스트 3 〉	통과 (0.37ms, 74MB)
테스트 4 〉	통과 (0.41ms, 79.3MB)
테스트 5 〉	통과 (0.28ms, 73.3MB)
테스트 6 〉	통과 (0.76ms, 76.1MB)
테스트 7 〉	통과 (0.64ms, 79.2MB)
테스트 8 〉	통과 (1.65ms, 76.3MB)
테스트 9 〉	통과 (0.45ms, 74.6MB)
테스트 10 〉	통과 (1.02ms, 73MB)
테스트 11 〉	통과 (1.12ms, 75MB)
테스트 12 〉	통과 (0.29ms, 76.6MB)
테스트 13 〉	통과 (1.35ms, 65.2MB)
테스트 14 〉	통과 (0.28ms, 73.6MB)
테스트 15 〉	통과 (0.28ms, 76.8MB)
테스트 16 〉	통과 (0.59ms, 78.4MB)
테스트 17 〉	통과 (1.74ms, 74.3MB)
테스트 18 〉	통과 (0.52ms, 72.9MB)
테스트 19 〉	통과 (1.80ms, 66.6MB)
테스트 20 〉	통과 (0.72ms, 75.5MB)

채점 결과
정확성: 100.0
합계: 100.0 / 100.0

 


[ 좋은 풀이 ]

 

최원준 님, 송영제 님, 이민아 님, 최경식 님 외 12 명의 풀이

📌 코드

import java.util.*;

class Solution {
    public int solution(int[] priorities, int location) {
        int answer = 0;
        int l = location;

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

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



        while(!que.isEmpty()){
            Integer i = que.poll();
            if(i == priorities[size - answer]){
                answer++;
                l--;
                if(l <0)
                    break;
            }else{
                que.add(i);
                l--;
                if(l<0)
                    l=que.size()-1;
            }
        }

        return answer;
    }
}

 

📌 해석

  1. queue에는 각 프로세스의 우선순위를 프로세스의 순서대로 넣어둔다.
  2. location을 줄이는 이유
    • queue에서 front에 있는 것을 하나하나 뺄 때마다 location으로 한 칸씩 다가가는 것이기 때문.
    • location을 한 칸 빼줬더니 location이 0 미만이 됨 / front 프로세스는 실행되지 않는다면
      • location을 다시 queue의 size() -1 만큼 복귀시켜준다.
    • location을 한 칸 빼줬더니 location이 0 미만이 됨 /  front 프로세스가 실행됐다.
      • 해당 location에 있는 프로세스의 실행 순번이 된 것이므로 answer을 return 해주면 된다!
  3. prorities를 오름차순 정렬하는 이유,
    i를 (size - answer) 인덱스에 있는 우선순위와 비교하는 이유
    • (size - answer) = 실행 대기 중인 프로세스의 수 (i 포함)
    • prorities를 오름차순 정렬 해두었기 때문에, (size - answer) 인덱스에 있는 값은
      현재 실행대기 중인 프로세스들 중에서 가장 우선순위가 높은 프로세스의 우선순위 값이다.
    • (poll() 해온 프로세스의 우선순위 값) == (가장 우선순위가 높은 프로세스의 우선순위 값)
      • → 해당 프로세스를 실행하면 된다는 뜻.
  1.