[Level1] 2. 4 ~ 9




4. 프린터 - 우선순위큐

programmers


function Queue() {
  this.array = [];
}

Queue.prototype.enqueue = function (element) {
  this.array.push(element);
};

Queue.prototype.dequeue = function () {
  return this.array.shift();
};

Queue.prototype.front = function () {
  return this.array[0];
};

Queue.prototype.max = function () {
  return Math.max(...this.array);
};

function solution(priorities, location) {
  var answer = -1;

  let vq = new Queue();
  let pq = new Queue();

  for (let i = 0; i < priorities.length; i++) {
    vq.enqueue(i);
    pq.enqueue(priorities[i]);
  }

  let count = 0;
  while (true) {
    if (pq.front() === pq.max()) {
      count++;
      if (vq.front() === location) {
        answer = count;
        break;
      } else {
        vq.dequeue();
        pq.dequeue();
      }
    } else {
      vq.enqueue(vq.dequeue());
      pq.enqueue(pq.dequeue());
    }
  }

  return answer;
}

console.log(solution([2, 1, 3, 2], 2))



5. 완주하지 못한 선수

programmers


function solution(participant, completion) {
  let p,
    d = {};
  for (let i = 0; i < completion.length; i++) {
    p = completion[i];
    if (d[p]) d[p]++;
    else d[p] = 1;
  }

  for (let i = 0; i < participant.length; i++) {
    p = participant[i];
    if (!d[p]) return p;
    d[p]--;
  }
}


function solution(participant, completion) {
  participant.sort()
  completion.sort()

  for (let i in participant) {
   if(participant[i] !== completion[i]) return participant[i]
  }
}

위 방법은 풀이가 굉장이 심플하지만 효율성 측면으로는 딕셔너리 이용한 게 더 좋다



6. 기능 개발

programmers

function solution(progresses, speeds) {
    var answer = [];
    // 앞 기능이 배포되어야 뒤에 기능도 배포될 수 있다 => queue
    // 진척도 > 앞 기능이 배포될 수 있는 날짜
    // 진척도 + 작업속도 * 날짜 >= 100
    // 방정식으로 날짜 구하기

    let head = 0
    let tail = progresses.length;
    let day = 0
    let count;

    while(head != tail){
        count = 0
        day++
        for (let i = head; i < tail; i++){
            if (progresses[i] + speeds[i] * day < 100) break
            count++
        }

        if (count) {
            answer.push(count)
            head += count
        }
    }
    return answer;
}



7. 네트워크 - bfs-인접행렬

programmers

function dfs(computers, visited, idx) {
  if (visited[idx]) {
    return 0;
  }

  visited[idx] = 1;

  for (let i = 0; i < computers[idx].length; i++) {
    if (computers[idx][i]) {
      dfs(computers, visited, i);
    }
  }
  return 1;
}

function solution(n, computers) {
  var answer = 0;
  let visited = new Array(n).fill(0);

  for (let i = 0; i < n; i++) {
    answer += dfs(computers, visited, i);
  }

  return answer;
}



8. 가장 큰 수 - 정렬

programmers

function solution(numbers) {
    var answer = numbers
        .map((n) => n + "")
        .sort((x, y) => (y + x) - (x + y))
        .join("");
    return answer.split(0).join("") ? answer : "0"
}



9. H-Index

programmers

function solution(citations) {
  var answer = 0;
  citations.sort((x, y) => y - x);
  for (let i = 0; i < citations.length; i++) {
    if (citations[i] >= i + 1) answer = i + 1;
  }
  return answer;
}

while (answer + 1 <= citations[answer]) answer++ 로 for 문 줄일 수 있다.