[프로그래머스 JavaScript] 프로세스

DO YEON KIM·2023년 5월 23일
0

프로그래머스 Lv2

목록 보기
24/57


문제 설명
운영체제의 역할 중 하나는 컴퓨터 시스템의 자원을 효율적으로 관리하는 것입니다. 이 문제에서는 운영체제가 다음 규칙에 따라 프로세스를 관리할 경우 특정 프로세스가 몇 번째로 실행되는지 알아내면 됩니다.

1. 실행 대기 큐(Queue)에서 대기중인 프로세스 하나를 꺼냅니다.
2. 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣습니다.
3. 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다.
3.1 한 번 실행한 프로세스는 다시 큐에 넣지 않고 그대로 종료됩니다.

예를 들어 프로세스 4개 [A, B, C, D]가 순서대로 실행 대기 큐에 들어있고, 우선순위가 [2, 1, 3, 2]라면 [C, D, A, B] 순으로 실행하게 됩니다.

현재 실행 대기 큐(Queue)에 있는 프로세스의 중요도가 순서대로 담긴 배열 priorities와, 몇 번째로 실행되는지 알고싶은 프로세스의 위치를 알려주는 location이 매개변수로 주어질 때, 해당 프로세스가 몇 번째로 실행되는지 return 하도록 solution 함수를 작성해주세요.


제한사항

  • priorities의 길이는 1 이상 100 이하입니다.
  • priorities의 원소는 1 이상 9 이하의 정수입니다.
  • priorities의 원소는 우선순위를 나타내며 숫자가 클 수록 우선순위가 높습니다.
  • location은 0 이상 (대기 큐에 있는 프로세스 수 - 1) 이하의 값을 가집니다.
  • priorities의 가장 앞에 있으면 0, 두 번째에 있으면 1 … 과 같이 표현합니다.

입출력 예 설명
예제 #1

  • 문제에 나온 예와 같습니다.

예제 #2

  • 6개의 프로세스 [A, B, C, D, E, F]가 대기 큐에 있고 중요도가 [1, 1, 9, 1, 1, 1] 이므로 [C, D, E, F, A, B] 순으로 실행됩니다. 따라서 A는 5번째로 실행됩니다.

function solution(priorities, location) {
    let answer = 0;
    let arr = []
    let max_value = Math.max(...priorities);

    //위치 배열 만들기
    for(let i = 0; i < priorities.length; i++){
        arr.push(i);
    }

   //priorities 배열이 비어있을 때까지 반복
    while(priorities.length != 0){
         max_value = Math.max(...priorities);
        
        if(priorities[0] < max_value){
            priorities.push(priorities.shift());
            arr.push(arr.shift());
        }else {
            answer+=1;
            priorities.shift();
            if(arr.shift() == location)
                return answer;
        }
    }
}

... 은 전개 연산자(Spread Operator)로, JavaScript에서 배열이나 함수 호출 시 사용되는 특별한 구문이다.

  • 배열에서 사용되는 경우:

  • ...을 사용하여 배열을 펼칠 수 있습니다. 즉, 배열을 개별 요소로 분리한다.

  • 예를 들어, [1, 2, ...[3, 4], 5]는 [1, 2, 3, 4, 5]로 펼쳐진다.

  • Math.max(...arr)와 같이 사용하면 배열 arr의 요소 중 가장 큰 값을 구할 수 있다.

  • 함수 호출에서 사용되는 경우:

  • ...을 사용하여 함수에 배열을 전달할 수 있습니다. 이는 배열의 요소들이 개별적인 인수로 전달되는 것을 의미한다.

  • 예를 들어, myFunction(...myArray)는 myArray의 각 요소를 개별적인 인수로 myFunction에 전달한다.

  • 따라서, ...priorities는 priorities 배열을 전개하여 개별적인 요소로 사용하는 것을 의미한다. Math.max(...priorities)는 priorities 배열의 요소 중 가장 큰 값을 구하는 것을 의미한다.

  • 그렇다면 위 코드에서 ...이 사용된 이유는 ?

  • 위 ...priorities는 priorities 배열의 요소를 펼쳐서 개별적인 값으로 사용하는 것을 의미한다. Math.max() 함수는 개별적인 인수를 받아 최댓값을 반환하는 함수인데 배열을 인수로 직접 전달하면 배열 전체가 단일 인수로 간주되어 최댓값을 구하는 대상이 아니라 NaN을 반환할 수 있기 때문이다.

  • max_value = Math.max(...priorities);를 위에 같이 선언해주면 안되는 것인가?

  • max_value = Math.max(...priorities)는 현재 남아있는 작업의 우선 순위 중 가장 높은 우선 순위를 찾기 위하여 사용한다. 이 값은 반복문 내에서 계속 업데이트 해야 하기 때문에 반복문 안에 위치해야한다! 만약 max_value = Math.max(...priorities)를 반복문 밖에서 선언한다면, 초기 max_value 값은 반복문 진입 시점의 priorities 배열의 가장 큰 값으로 설정되고 이후에는 업데이트되지 않는다.


shift()는 JavaScript 배열 객체의 내장 함수 중 하나다. 이 함수는 배열에서 첫 번째 요소를 제거하고 그 값을 반환한다. 제거된 요소로 인해 배열의 길이가 변하게 된다.


  • 스택/큐란?

스택(Stack)과 큐(Queue)는 자료 구조의 일종으로, 데이터의 삽입과 삭제가 제한적으로 이루어지는 구조이다. 이들은 주로 데이터의 관리와 처리에 사용되며, 많은 알고리즘과 문제에서 유용하게 활용된다.

스택(Stack):

  • 스택은 LIFO(Last-In, First-Out) 방식으로 동작한다. 마지막에 삽입된 데이터가 가장 먼저 삭제되는 원리이다.
    데이터의 삽입은 스택의 상단(top)에 진행되며, 삭제도 상단에서 이루어진다.

  • 주요 동작:

    	push: 스택의 상단에 데이터를 삽입합니다.
    	pop: 스택의 상단에서 데이터를 삭제합니다.
    	top: 스택의 상단에 위치한 데이터를 반환합니다.

큐(Queue):

  • 큐는 FIFO(First-In, First-Out) 방식으로 동작한다. 먼저 삽입된 데이터가 먼저 삭제되는 원리. 데이터의 삽입은 큐의 뒤(rear)에서 이루어지며, 삭제는 큐의 앞(front)에서 이루어진다.

주요 동작:

enqueue: 큐의 뒤(rear)에 데이터를 삽입합니다.
dequeue: 큐의 앞(front)에서 데이터를 삭제합니다.
front: 큐의 앞(front)에 위치한 데이터를 반환합니다.
profile
프론트엔드 개발자를 향해서

0개의 댓글