[Study] 구름톤 챌린지 이진수 정렬 - JavaScript

박하민·2023년 8월 18일

어느덧 일주일의 마지막인 금요일이 되었습니다! 초라했던 피규어에 노트북, 모자 등등 점점 Flex 하는 모습을 보니 블록을 모두 다 쌓았을 때는 어떤 모습이 될지 궁금해지네요~~🤔

구름톤 챌린지


오늘의 문제는 이진수 정렬입니다!
문제에서 명시한 것처럼 정렬을 사용하는 문제입니다. sort() 메서드가 사용되겠네요.

풀이

const readline = require('readline');

let rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let N, K;
let cnt = 0;
let a = [];
let arr = [];

rl.on('line', (line) => {
  cnt++;
  if (cnt === 1) {
    [N, K] = line.split(' ').map(Number);
  } else {
    a = line.trim().split(' ').map(Number);
  }
});

rl.on('close', () => {
  for (const v of a) {
    let count = v.toString(2).split('1').length - 1;

    arr.push([v, count]);
  }

  arr.sort((a, b) => {
    if (a[1] === b[1]) {
      return b[0] - a[0];
    }

    return b[1] - a[1];
  });

  console.log(arr[K - 1][0]);
});
  1. 우선 arr 배열에 N까지의 숫자와 2진수로 변환됐을 때 1의 개수를 의미하는 count를 모두 담아줍니다.
    [ [숫자, 2진수 변환 시 1의 개수], [숫자, 2진수 변환 시 1의 개수] ... ]
    이런 식으로 arr 배열에 담기게 됩니다. 앞에는 숫자, 뒤에는 2진수로 변환했을 때 1의 개수입니다!

  2. 이제 내림차순 정렬을 위해 sort() 메서드를 사용해 줍니다.
    a[1], b[1]은 아까 arr 배열의 [1, 2]라는 값처럼 배열에 담길 때 1번째 값 즉 2진수로 변환됐을 때 1의 개수를 의미합니다

  • 1의 개수가 같다면 10진수를 기준으로 정렬한다.

조건문으로 만약 1의 개수가 동일하다면~ return b[0] - a[0] 즉 10진수를 내림차순 해서 정렬해야 합니다.

조건에 해당하지 않는다면 return b[1] - a[1] 코드가 실행돼 1의 개수를 기준으로 정렬이 됩니다.

  1. 이제 값을 출력하기만 하면 됩니다.
    찾고자 하는 K번째 수에 - 1을 해줍니다. (배열은 0부터 시작이므로 1을 빼줍니다.)
    그리고 숫자가 위치한 0번째 값을 출력하면 됩니다!

후기

처음에 Map을 사용해서 풀어보려고 했지만 조건의 범위가 커서 시간 초과가 계속 발생해서 단순하게 배열로 사용해서 풀었습니다. 이번 문제는 굳이 Map을 사용할 필요 없이 간단하게 배열을 사용해서 풀 수 있는 문제기 때문에 문제를 잘 파악하고 상황에 맞게 사용할 수 있도록 많은 연습이 필요할 것 같습니다~

profile
https://mintmin.dev/ <~~ 블로그 이전했씁니다

0개의 댓글