Post

[BOJ] 2865 - 나는 위대한 슈퍼스타K

[백준] 2865 - 나는 위대한 슈퍼스타K

js에서 정렬하기

아주.. 충격적인 문제였다.. 사건의 발단은 js sort함수를 구글링해서 함수의 존재만 알고 고대로 제출했는데 자꾸 틀리길래 머리를 싸매다가 디버깅 하는 과정에서 놀라운 사실을 알아낸 것이다..
무려무려 js에서는 정렬함수가 기본적으로 문자열 정렬이라고 한다!!!!!!
어쩐지 음수와 양수를 정렬했는데 음수도 앞에 -만 붙은채로 절댓값이 오름차순정렬되고 음수 다음에 양수가 오름차순 정렬이 되길래.. 이게 대체 무슨 기준이지? 하고 그냥 제출한 것이 화근이었다.
숫자형태의 배열을 정렬하고 싶다면 sort내부에 따로 비교함수를 매개변수로 넣어줘야 한다고 한다.

막간을 이용한 화살표함수

본래 자바스크립트의 기본 함수선언 형태는 다음과 같다.

1
2
3
4
function(매개변수) {
  //... 블라블라
  return rtn;
}

그치만 사람들은 놀랍게도 function을 쓰는것을 귀찮아하기 시작했다!(귀찮을만하지) 그래서 다음과 같은 형태로 화살표함수를 이용해도 같은 의미를 띄게 했다.

1
2
3
4
(매개변수)=>{ // 매개변수가 한 개 뿐이라면 괄호를 쓰지 않아도 된다.
  //... 블라블라
  return rtn;
}

여기서 한 술을 더 떴는데 js에서는 어떠한 알맹이 없이 매개변수를 받으면 바로 그에 대한 return만 존재하는 경우는 중괄호와 리턴까지도 생략할 수 있게 한것이다!
따라서 다음 두 코드는 같은 의미를 가진다.

1
2
3
function(a, b){
  return b-a;
}
1
(a, b) => b-a

처음 화살표 함수를 봤을때는 무슨 의미인지 몰라 당황했지만.. 보다 보니까 귀여운 것 같기도 하고.. 아직 js공부한지 3일밖에 안돼서 적응은 덜 된 것 같다. 아직 친해지지 못했다..

소스코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
const readline = require("readline");

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

let n, m, k;
let part = [];
let i = 0;
rl.on("line", function (line) {
  tmp = line.split(" ");
  if (i == 0) {
    n = tmp[0];
    m = tmp[1];
    k = tmp[2];
    for (let j = 0; j < n; j++) {
      part.push([]);
    }
  } else {
    for (let j = 0; j < n; j++) {
      part[tmp[2 * j] - 1].push(tmp[2 * j + 1]);
    }
  }
  i += 1;
}).on("close", function () {
  let ans = 0,
    tmp = [];
  for (let i of part) {
    i.sort((a, b) => b-a);
    tmp.push(i[0]);
  }
  tmp.sort((a, b) => b-a);
  for (let i = 0; i < k; i++) {
    ans += tmp[i] * 1.0;
  }
  ans = ans.toFixed(1);
  if (Number.isInteger(ans)) console.log(ans + ".0");
  else console.log(ans);
  process.exit();
});
This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.