[백준] 11582 치킨 TOP N JavaScript

·2024년 5월 27일

문제

인하대 주변 치킨칩의 맛의 정도를 측정해 수치화하는 동아리 C.T.P(Chicken Tastes Perfect)의 회장 민호는 치킨집의 맛의 수치를 감소하지 않는 순으로 정렬을 하고 싶었다. 하지만 치킨집이 너무 많아 혼자 정렬을 하기에는 많은 시간이 걸려 C.T.P 회원들을 활용하기로 했다. 치킨집이 N개 있다고 가정을 하자. N개의 치킨의 수치를 무작위로 놓은 뒤 N/2명의 C.T.P 회원이 차례대로 2개의 치킨집을 선택해 정렬을 한다. 그 뒤 N/4명이 차례대로 바로 전 단계의 사람이 정렬한 두 개의 그룹을 차례대로 선택 하여 치킨집을 정렬을 한다. 계속해서 N/8명, N/16명이 정렬을 진행하다가 마지막 사람이 두 개의 정렬된 그룹을 합병하여 작업을 완료한다.

예를 들어 8개의 치킨집의 점수가 (1, 5, 2, 4, 2, 9, 7, 3)과 같을 때, 첫 번째로 4명의 회원이(1, 5), (2, 4), (2, 9), (7, 3)을 각각 정렬하게 되면 (1, 5), (2, 4), (2, 9), (3, 7)이 되고, 두 번째로 2명의 회원이 ((1, 5), (2, 4))와 ((2, 9), (3, 7))을 정렬하면 (1, 2, 4, 5), (2, 3, 7, 9)가 되고, 최종적으로 1명의 회원이 ((1, 2, 4, 5), (2, 3, 7, 9))을 정렬하여 (1, 2, 2, 3, 4, 5, 7, 9)을 만들게 된다.

작업을 진행하던 중 문득 민호는 작업의 중간단계가 궁금해졌다. 현재 단계에서 k명의 회원이 정렬을 진행할 때 정렬을 마친 뒤 결과를 출력해라.

입력

첫 번째 줄에 치킨집의 개수 N(4 ≤ N ≤ 220)이 주어진다. N은 항상 2의 거듭제곱 꼴이다.

두 번째 줄에는 N개의 치킨집의 맛의 수치들이 빈칸을 구분으로 주어지며 이 값은 10억보다 작거나 같은 자연수 또는 0이다.

세 번째 줄에는 현재 정렬을 진행중인 회원들의 수 k(1 ≤ k < N)가 주어진다. k 또한 2의 거듭제곱 꼴이다.

출력

현재 단계에서 k명이 정렬을 진행한다고 할 때, 현재 단계가 완료한 상태를 출력하라.

예제 입력

8
1 5 2 4 2 9 7 3
2

예제 출력

1 2 4 5 2 3 7 9

내가 했던 풀이 방법

  1. N과 k를 저장하고, 맛 수치를 figure에 [num]형태로 저장해준다. 예를 들어 1 2 3 4인 경우, [[1], [2], [3], [4]]로 저장해준다.
  2. index를 0으로 초기화하고, nth를 2로 초기화해준다.
  3. 0부터 figure.length까지 i를 2씩 증가시키면서, figure[i]와 figure[i+1]을 합쳐준다. 합친 값은 figure[index]에 저장해주고, figure[index]는 오름차순으로 정렬하면서 연산 후 index를 1증가시켜준다. (i를 2씩 증가시켜주는 이유는 2개의 배열이 하나로 합쳐지기 때문이다.)
  4. figure을 0부터 index까지 잘라준다. (index를 따로 관리하는 이유이고, index 이후는 이전 계산 값이 들어있을 뿐 해당 값들은 앞쪽으로 합쳐졌기 때문에 없어져야 한다.)
  5. N/nth 결과가 k일 때 while문을 탈출하고, k가 아닐 경우 nth에 2를 곱한 뒤, 3번부터 다시 진행한다. (이때 index는 계속 초기화해주어야 한다.)
  6. while문 탈출 후, 0부터 index-1까지의 figure[i]을 한 줄로 합쳐준다.

코드

const fs = require('fs');
let [N, figure, k] = fs.readFileSync(0, 'utf-8').toString().trim().split('\n');

N = Number(N);
k = Number(k);
figure = figure
  .trim()
  .split(' ')
  .map((num) => [Number(num)]);

let nth = 2;
let index = 0;
while (true) {
  index = 0;
  for (let i = 0; i < figure.length; i += 2) {
    figure[index] = figure[i].concat(figure[i + 1]);
    figure[index++].sort((a, b) => a - b);
  }
  figure = figure.slice(0, index);
  if (N / nth === k) break;
  nth *= 2;
}

let answer = '';
for (let i = 0; i < index; i++) {
  answer += figure[i].join(' ') + ' ';
}

console.log(answer.trim());

회고

제한시간도 굉장히 길기 때문에 문제에서 요구하는 그대로 구현하면 금방 풀이 가능한 문제.

profile
Frontend🍓

0개의 댓글