문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42587
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
[ 요약 ]
더보기
시작 시간 : 오후 1시 08분
종료 시간 : 오후 1시 50분
소요 시간(분) : 42분
도전 횟수 (제출 횟수) : 1회
로직 및 풀이 참고 여부 : X
[ 풀어보기 ]
정답 풀이
📌 로직
- Quque 객체를 queue를 생성하고, 0부터 priorities.length - 1 까지의 수를 집어넣는다. (프로세스의 이름)
- queue가 빌 때까지 반복하는 while문을 생성한다.
- queue의 가장 상단 값을 꺼내, int top으로 지정한다.
- top의 우선순위와 quque에 들어가있는 나머지 프로세스의 우선순위를 비교하기 위한 for문을 만든다.
- 만약 top 보다 우선순위가 높은 프로세스가 있으면,
top을 quque에 추가하고 해당 for문을 빠져나온다.
- 만약 top 보다 우선순위가 높은 프로세스가 있으면,
- 우선순위 비교 전 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;
}
}
📌 해석
- queue에는 각 프로세스의 우선순위를 프로세스의 순서대로 넣어둔다.
- location을 줄이는 이유
- queue에서 front에 있는 것을 하나하나 뺄 때마다 location으로 한 칸씩 다가가는 것이기 때문.
- location을 한 칸 빼줬더니 location이 0 미만이 됨 / front 프로세스는 실행되지 않는다면
- location을 다시 queue의 size() -1 만큼 복귀시켜준다.
- location을 한 칸 빼줬더니 location이 0 미만이 됨 / front 프로세스가 실행됐다.
- 해당 location에 있는 프로세스의 실행 순번이 된 것이므로 answer을 return 해주면 된다!
- prorities를 오름차순 정렬하는 이유,
i를 (size - answer) 인덱스에 있는 우선순위와 비교하는 이유
- (size - answer) = 실행 대기 중인 프로세스의 수 (i 포함)
- prorities를 오름차순 정렬 해두었기 때문에, (size - answer) 인덱스에 있는 값은
현재 실행대기 중인 프로세스들 중에서 가장 우선순위가 높은 프로세스의 우선순위 값이다. - (poll() 해온 프로세스의 우선순위 값) == (가장 우선순위가 높은 프로세스의 우선순위 값)
- → 해당 프로세스를 실행하면 된다는 뜻.
'코딩테스트 - 프로그래머스 > JAVA' 카테고리의 다른 글
[프로그래머스 / 2018 KAKAO BLIND RECRUITMENT / 자바(JAVA)] [1차] 뉴스 클러스터링 (0) | 2024.05.06 |
---|---|
[프로그래머스 / 완전탐색 / 자바(JAVA)] 피로도 (0) | 2024.05.01 |
[프로그래머스 / 2019 카카오 개발자 겨울 인턴십 / 자바(JAVA)] 튜플 (0) | 2024.04.23 |
[프로그래머스 / 스택/큐 / 자바(JAVA)] 기능 개발 (0) | 2024.04.22 |
[프로그래머스 / 해시 / 자바(JAVA)] 의상 (0) | 2024.04.19 |