코딩테스트 문제
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 접근)
해당 location에 위치한 프로세스가 프로세스 우선순위로 실행 됐을 떄 몇번째에 실행되는지 체크하는 것이므로 우선순위가 높 -> 낮은 순서대로 큐를 이용하여 해결하면 됩니다.
정답 및 해설
function solution(priorities, location) {
let answer = 0; // location이 위치한 프로세스가 몇번째로 실행되는지의 값
/*
location이 인덱스에 위치인데 우선순위별로 정렬하다보면 priorities의 위치가 뒤죽박죽되므로,
해당 인덱스 정렬되어있는 하나의 배열이 필요하여 arr에 인덱스 위치를 저장하였습니다.
처음엔 A~D이런 문자열로 담을까 했는데, 이 문제에서는 문자랑은 상관없고 location의 프로세스에 왔을 때
해당 프로세스가 몇번째로 실행되는지만 체크하면 됩니다.
*/
let arr = priorities.map((_, idx) => idx); // 해당 priorities의 인덱스 위치 저장
while(priorities.length) { // priorities의 길이가 있으면 계속 반복 실행
let maxValue = Math.max(...priorities); // priorities의 최대값 저장
if (priorities[0] < maxValue) { // 우선순위가 높은 것이 있다면
priorities.push(priorities.shift()); // priorities의 맨앞에 값을 다시 큐에 넣습니다.
arr.push(arr.shift()); // arr(인덱스 위치)도 우선순위에서 처럼 위치 변경
} else { // 우선순위가 높은게 없으면
answer++; // 프로세스를 실행했으니 +1 증가 시켜줍니다.
priorities.shift(); // 우선순위에서 꺼내서 프로세스를 실행해줍니다.
if (arr.shift() === location) { // locaion(인덱스 위치) 와 arr의 인덱스 위치가 같게 되면 해당 위치까지 왔으므로 반복문 종료
break;
}
}
}
return answer;
}
// 첫번쨰 예제를 로그를 출력하면 아래와 같습니다
{ priorities: [ 1, 3, 2, 2 ], arr: [ 1, 2, 3, 0 ], answer: 0 }
{ priorities: [ 3, 2, 2, 1 ], arr: [ 2, 3, 0, 1 ], answer: 0 }
{ priorities: [ 2, 2, 1 ], arr: [ 3, 0, 1 ], answer: 1 }
// 두번째 예제를 로그를 출력하면 아래와 같습니다.
{
priorities: [ 1, 9, 1, 1, 1, 1 ],
arr: [ 1, 2, 3, 4, 5, 0 ],
answer: 0
}
{
priorities: [ 9, 1, 1, 1, 1, 1 ],
arr: [ 2, 3, 4, 5, 0, 1 ],
answer: 0
}
{ priorities: [ 1, 1, 1, 1, 1 ], arr: [ 3, 4, 5, 0, 1 ], answer: 1 }
{ priorities: [ 1, 1, 1, 1 ], arr: [ 4, 5, 0, 1 ], answer: 2 }
{ priorities: [ 1, 1, 1 ], arr: [ 5, 0, 1 ], answer: 3 }
{ priorities: [ 1, 1 ], arr: [ 0, 1 ], answer: 4 }
{ priorities: [ 1 ], arr: [ 1 ], answer: 5 }