TIL_2023.06.21

이얏호·2023년 6월 21일
0
post-custom-banner

프로세스 관리에 대한 문제이다.
유의할 점은 우선순위가 높은 프로세스부터 실행되며
프로세스가 실행 된 이후 남은 프로세스들의 우선순위가 동일하다면
마지막으로 실행된 프로세스의 인덱스 기준으로 우측으로 돌아가며
끝까지 도달했을 경우, 다시 배열의 가장 좌측 프로세스부터 순차적으로 실행된다.

내가 return해야할 값은 location에 해당하는 프로세스가 몇 번 째로 실행되는지 확인을 해야했다.

일단 생각난 방법은 조건에 맞도록 정렬을 시키고 location에 해당하는 프로세스가 몇 번째로 실행됐는지 확인하는 것이었다.

여기서 문제가 있었는데 priorities배열 자체를 정렬해버리면 location에 해당했던 프로세스가 어디로 이동했는지 알 수 없다는 문제점이 존재했다.

그래서 우선 새로 배열을 만들어줬는데 이차원 배열 형식으로 내부 배열안에는 원본 상태에서의 인덱스 번호와 프로세스의 우선순위가 들어있는 배열을 생성해주었다.

let newArr = [];
  for (let index in priorities) {
    newArr.push([index, priorities[index]]);
  }
  
  // newArr은 다음과 같은 형식!
[
  [ '0', 1 ],
  [ '1', 1 ],
  [ '2', 9 ],
  [ '3', 1 ],
  [ '4', 1 ],
  [ '5', 1 ]
]

이후에 정렬을 시도해주었는데 우선 조건에서 우선순위가 가장 큰 프로세스 부터 실행하기에
while을 계속 돌리면서 내부의 for문을 통해 가장 큰 값을 찾아주었다.

  let index = 0;
  let l = newArr.length;
  let Aarr = [];
  let big = newArr[0][1];
  while (Aarr.length < l) {
    index = 0;
    big = newArr[0][1];
    for (let i = 1; i < newArr.length; i++) {
      if (big < newArr[i][1]) {
        index = i;
        big = newArr[i][1];
      }
    }
    let a = newArr.splice(0, index + 1);
    let c = a.splice(0, index);
    newArr.push(...c);
    Aarr.push(...a);
    if (newArr.length <= 1) {
      Aarr.push(...newArr);
      break;
    }
  }

big변수에 newArr의 0번 인덱스의 우선순위 값을 지정해주고
for문을 돌리면서 만약 big보다 i번째의 우선순위 값이 더 클 경우
index변수에 i를 할당하고 big 변수에 새로 newArr[i][1]값을 할당해주었다.

이후 for문을 빠져나오면 a변수에 0번인덱스부터 index+1(가장 큰 우선순위)까지를 잘라서 할당해주고
다시 가장 큰 우선순위를 가진 프로세스를 제외한 나머지를 c변수에 할당해주었다.


newArr에는 가장 큰 우선순위를 가진 프로세스 기준으로 우측에 존재했던 프로세스들,
a에는 가장 큰 우선순위를 가진 프로세스
c에는 가장 큰 우선순위를 가진 프로세스 기준으로 좌측에 존재했던 프로세스들,
이 담기게 된다.
이 상태에서 c를 newArr에 push 해주었고
미리 준비한 빈 Aarr 배열에 a를 push 해주었다.
이 과정을 newArr의 길이가 1이 될 때까지 반복하였고, 1이 되었다면
남은 프로세스를 마지막으로 Aarr배열에 담아주고 while문을 빠져나왔다.

이 과정을 거쳐서 주어진 조건에 맞게 배열이 정렬이 완료되었다.

for (let k = 0; k < Aarr.length; k++) {
    if (Aarr[k][0] == String(location)) {
      return k + 1;
    }
  }

마지막으로 이렇게 완성된 정렬된 배열에서 location에 위치했던 프로세스가 현재 몇 번째에
위치했는지를 return해주어 문제를 해결했다.



정말 조건을 주어진대로 그대로 정렬을 하고, 반환하면서 반복문이 많이 사용되어 성능이 좋지는 않아보인다.
개선이 필요한 것 같다.
나중에 바꿔보는 걸로..

profile
열심히 신나게 화이팅!
post-custom-banner

0개의 댓글