문제를볼때마다 느끼는것이 있는데, 자료 구조나 스택문제는 계속해서 나오는것 같다.
1. 실행 대기 큐(Queue)에서 대기중인 프로세스 하나를 꺼냅니다.
2. 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣습니다.
3. 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다.
3.1 한 번 실행한 프로세스는 다시 큐에 넣지 않고 그대로 종료됩니다.
먼저 나는 LinkedList를 이용해서 que라는 리스트를 초기화했다.
그 이유는 LinkedList가 특히 목록의 시작이나 끝에서 효율적인 삽입 및 삭제 작업으로 인해 대기열을 구현하는 데에
적합하기 때문이다.
LinkedList에는 각각의 요소가 Pair로 이루어져 있으며, 첫 번째 요소는 우선순위를 나타내고, 두 번째 요소는 해당 요소의 인덱스를 나타낸다.
입력으로 받은 우선순위 배열을 순회하면서 각 우선순위와 해당 인덱스를 offer를 통해 que에 추가했다.
코드는 아래와 같이 작성하였다.
var que = LinkedList<Pair<Int,Int>>()
//우선순위와 인덱스로 이루어진 큐 초기화
for((index,priority) in priorities.withIndex()){
que.offer(Pair(priority,index)) // => // [(1, 0), (1, 1), (9, 2), (1, 3), (1, 4), (1, 5)] 각요소 튜플의 첫요소가 우선순위이고 //2번째 요소가 인덱스임
}
var maxPriority:Intwhile(que.isNotEmpty()){ //큐에서 가장 높은 우선순위를 찾는다. maxPriority = que.maxByOrNull{it.first}!!.first//프로세스를 큐에서 빼낸다.val currentProcess = que.poll()
//빼낸 프로세스가 가장 높은 우선순위인지 확인하고, 그렇다면 카운트함if(currentProcess.first == maxPriority){ answer++ //빼낸 프로세스의 위치가 목표 위치와 일치하는지 확인하고, 일치한다면 카운트를 반환함 if(currentProcess.second == location){ return answer }}else{ //최고 우선순위가 아닌 경우, 프로세스를 다시 큐에 넣음que.offer(currentProcess)}}
'TIL > kotlin 알고리즘' 카테고리의 다른 글
kotlin 프로그래머스 lv2 타겟넘버 (0) | 2024.03.15 |
---|---|
kotlin 프로그래머스 lv2 피로도 (0) | 2024.03.14 |
kotlin 프로그래머스 lv2 기능개발 (0) | 2024.03.13 |
kotlin 프로그래머스 lv2 할인 행사 (0) | 2024.03.12 |
kotlin 프로그래머스 lv2 행렬의 곱셈 (0) | 2024.03.12 |