👀 문제
https://school.programmers.co.kr/learn/courses/30/lessons/42587?language=kotlin
👊 도전
1. 설계
- 문제 조건에 맞게 진행
2. 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.*
class Solution {
fun solution(priorities: IntArray, location: Int): Int {
/*
큐에다가 Pair<index, prior> 형태로 넣고
poll한거의 location이 맞으면 cnt 리턴
max면 pop 하고 cnt ++ 아니면 다시 push (cnt 초기화는 1)
max 체크는 descPriorities 리스트.desc로 sort 얘를 가리키는 인덱스도 필요
*/
var answer = 1
val queue: Queue<Pair<Int, Int>> = LinkedList()
val descList = priorities.sortedDescending()
var descIndex = 0
priorities.forEachIndexed { index, priority ->
queue.offer(priority to index)
}
while (queue.isNotEmpty()) {
val item = queue.poll()
if (item.second == location && item.first == descList[descIndex]) {
return answer
}
if (item.first == descList[descIndex]) {
answer ++
descIndex ++
} else {
queue.offer(item)
}
}
return answer
}
}
3. 결과
🤟 성공 🤟
4. 설명
- Queue를 이용해 대기 목록을 관리
- 맨 앞의 값이 max면 뽑을 수 있고, 아니라면 맨 뒤에 삽입해야하므로 큐가 적절하다.
- 중요도와 인덱스를 함께 가져야 하므로 Pair 형으로 저장한다.
- 중요도 체크는 priorities를 내림차순 정렬한 리스트로 확인
- priorities를 내림차순으로 정렬한다(descList)
- 인쇄되지 않은(큐에서 뽑히지 않은) 것 들 중 max를 나타내는 인덱스 descIndex를 둔다.
- poll해서 체크
- 큐에서 poll 한 값이 조건에 맞는지 체크한다.
- 내가 알고 싶은 location이고 현재 max라면 해당 값을 리턴한다.
- 아니라면, 현재 큐에 있는 값 들 중 max인지 확인해서 맞다면 pop 및 cnt ++ (cnt는 뽑힌 개수를 나타낸다).
- max가 아니라면 맨 뒤에 삽입한다.