TIL/kotlin 알고리즘

kotlin 프로그래머스 lv2 프로세스

crablo 2024. 3. 14. 10:25
728x90

 

문제를볼때마다 느끼는것이 있는데, 자료 구조나 스택문제는 계속해서 나오는것 같다.

 

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)}}

 

728x90