728x90
풀이
import java.util.*
class Solution {
fun solution(priorities: IntArray, location: Int): Int {
val operationQ: Queue<PrintTarget> = LinkedList<PrintTarget>()
val standByQ: Queue<PrintTarget> = LinkedList<PrintTarget>(priorities.mapIndexed { index, priorityValue -> PrintTarget(index, priorityValue) })
/**
설명
- operationQ(실제 실행 대기열) 와 standByQ(실행 하기전 대기열) 두개의 큐를 선언한다.
- 문제의 조건에 맞추어 standByQ 에서 operationQ 로 값을 이동시킨다.
*/
while(standByQ.isNotEmpty()){
if(standByQ.isHigherThan()){
standByQ.offer(standByQ.poll())
}
else{
operationQ.offer(standByQ.poll())
}
}
return operationQ.getIndexByLocation(location)
}
}
/**
설명
- 프린트 대상을 클래스화 함
특징
- 해당 문제의 답으로 몇번째 위치에 있던 값을 궁금해함으로, `location` 변수를 추가
*/
data class PrintTarget(
val location: Int,
val priority: Int,
)
/**
설명
- 큐에서 priority 크기를 상대적 비교하는 코드이다.
- 해당 큐에서 head 의 priority 의 크기가 큰지 작은지에 대한 평가
특징
- 예를들어 2,1,3,2,3 이라는 우선순위를 가지는 array 가 있다고 가정할때
=> 해당 array 에서 제일 큰 우선순위는 3이다. 3이라는 우선순위를 가지는 경우가 2가지가 있다.
=> 그렇다면 해당 경우에서 2번째 index의 값이 먼저 출력되어야 하는 대상이다.
- Queue의 값을 순회하며 더 높은 priority 가 있다면 true, 그렇지 않다면 false 를 반환한다.
*/
fun Queue<PrintTarget>.isHigherThan(): Boolean{
val thisPriority = this.peek().priority
this.forEach { printTargetEle ->
if(thisPriority < printTargetEle.priority){
return true
}
}
return false
}
/**
설명
- 문제의 정답을 구하기 위한 확장함수이다.
*/
fun Queue<PrintTarget>.getIndexByLocation(location: Int): Int{
this.forEachIndexed { index, printTarget ->
if(location == printTarget.location){
return index+1
}
}
return 0
}
출처
728x90
'Algorithm > Programmers' 카테고리의 다른 글
Programmers 완전탐색 :: 레벨2 :: 카펫 (0) | 2022.07.19 |
---|---|
Programmers 이분탐색 :: 레벨3 :: 입국심사 (0) | 2022.07.14 |
Programmers :: 해시 전화 번호 목록 레벨2 (0) | 2022.03.26 |
Programmers :: 정렬 가장 큰 수 레벨2 (0) | 2022.03.23 |
Programmers :: Heap(힙) 더 맵게 레벨2 (0) | 2022.03.23 |