[JS] 프로그래머스 스택/큐 @프로세스 @다리를 지나는 트럭

김현수·2023년 11월 26일
0

cdt

목록 보기
26/51


🖋️ 프로그래머스 스택/큐


@ 프로세스

  • 운영체제의 역할 중 하나는 컴퓨터 시스템의 자원을 효율적으로 관리
  • 다음 규칙에 따라 프로세스를 관리할 경우 `특정 프로세스가 몇 번째로 실행되는지 알아내기
  1. 실행 대기 큐(Queue)에서
    대기중인 프로세스 하나를 꺼내기

  2. 큐에 대기중인 프로세스 중
    우선순위가 더 높은 프로세스가 있다면
    방금 꺼낸 프로세스를 다시 큐에 넣기

  3. 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행
    3.1 한 번 실행한 프로세스는 다시 큐에 넣지 않고 그대로 종료
  • 현재 실행 대기 큐(Queue)
    • 프로세스의 중요도가 순서대로 담긴 배열 priorities
    • 몇 번째로 실행되는지 알고싶은 프로세스의 위치를 알려주는 location
  • 나의 풀이

function solution(priorities, location) {
    // 우선순위 매핑
    const arr = priorities.map((v, index) => (
        {index: index, priority: v }
    ));

    const queue = [];
	
  	// 프로세스 대기열
    // 찾으려하는 location 위치의 index 가 등록될 때까지 반복
    while(queue.at(-1)?.index !== location) {
        // queue 인 FIFO 을 위해 shift
        const cur = arr.shift();
        // 우선순위가 가장 높은지 확인
        const hasHighPriority = arr.some(e => e.priority > cur.priority);
  
        // 가장 높지 않으면 
        if (hasHighPriority) {
            // 맨 뒤에 지금 node 다시 push
            arr.push(cur);
        } else {
            // 가장 우선순위 높은 순부터 push
            queue.push(cur);
        }
    }
    
    // 처리된 작업 수 반환
    return queue.length;
}
  • 더 좋은 풀이

function solution(priorities, location) {
    // 우선순위와 location 와 동일한지 매핑
    const list = priorities.map((t,i)=>({
        my : i === location,
        val : t
    }));
  
    let count = 0;  
    
    // 해당 위치를 찾을 때 까지 반환 
    while(true){
        // cur 은 queue 의 FIFO 대로 shift
        const cur = list.shift();     
        // list 에 우선순위가 더 높은값이 있으면
        if(list.some(t => t.val > cur.val)){
            // list 맨 뒤로 push
            list.push(cur);                        
        } else {    
            // list 우선순위 높은 프로세스 처리 시
            // 처리한 개수 +1
            count++;
            // 해당 위치값 찾으면 작업한 프로세스 개수 반환
            if(cur.my) return count;
        }
    }
}

@ 다리를 지나는 트럭

  • 트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너기
  • 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 구하기

  • 다리에는 트럭이 최대 bridge_length대 가능
  • 다리는 weight 이하까지의 무게 가능
  • 단, 다리에 완전히 오르지 않은 트럭의 무게는 무시
  • 좋은 풀이

function solution(bridge_length, weight, truck_weights) {
  // qu 는 [트럭 무게, 해당 트럭이 건너는 시간] 의 리스트
  let time = 0, qu = [[0, 0]], weightOnBridge = 0;

  // qu 와 truck_weights 모두 0 일 때까지 반복
  while (qu.length > 0 || truck_weights.length > 0) {

    // qu 의 첫번째 트럭이 시간이 같으면 
    // shift 하여 방출 후 그만큼 다리 위 무게 빼기
    if (qu[0][1] === time) weightOnBridge -= qu.shift()[0];
    
    // 다음 트럭 건널시, 다리가 견딜 수 있는 무게일 때
    if (weightOnBridge + truck_weights[0] <= weight) {
      // 해당 트럭 무게 더하기
      weightOnBridge += truck_weights[0];
      // qu 에 [트럭 무게, 현 시간 + 다리 길이] 등록하기
      qu.push([truck_weights.shift(), time + bridge_length]);
    } else {
      // 견딜 무대가 아닐 때 qu[0] 이 있으면 해당 시간만큼 time 더하기
      // 뒤에 time ++ 있기 때문에 -1
      if (qu[0]) time = qu[0][1] - 1;
    }

    time++;
  }
  
  return time;
}
profile
일단 한다

0개의 댓글