신입 개발자에서 시니어 개발자가 되기까지

[백준 nodeJs] 1764 듣보잡(feat. sort메서드) 본문

javascript/알고리즘

[백준 nodeJs] 1764 듣보잡(feat. sort메서드)

Jin.K 2022. 10. 13. 23:06

문제

김진영이 듣도 못한 사람의 명단과, 보도 못한 사람의 명단이 주어질 때, 듣도 보도 못한 사람의 명단을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다. 이름은 띄어쓰기 없이 알파벳 소문자로만 이루어지며, 그 길이는 20 이하이다. N, M은 500,000 이하의 자연수이다.

듣도 못한 사람의 명단에는 중복되는 이름이 없으며, 보도 못한 사람의 명단도 마찬가지이다.

출력

듣보잡의 수와 그 명단을 사전순으로 출력한다.

코드

const input = require("fs").readFileSync("example.txt").toString().trim();
const numberOfNotHeard = input.split("\n")[0].split(" ")[0];
const notHeard = input.split("\n").slice(1, +numberOfNotHeard + 1);
const notSeen = input.split("\n").slice(+numberOfNotHeard + 1);
const obj = {};
notHeard.forEach((item) => (obj[item] = 1));
notSeen.forEach((item) => {
  if (obj[item]) obj[item]++;
});
let result = [];

for (let key in obj) {
  if (obj[key] > 1) {
    result.push(key);
  }
}
result.sort((a, b) => {
  if (a > b) return 1;
  return -1;
});
result.unshift(Object.values(obj).filter((item) => item > 1).length);
console.log(result.join("\n"));

Sort 정렬함수

1. sort의 매개변수를 생략할 시에는 ASCII 문자 기준으로 오름차순으로 정렬된다.

- 정렬할 때 숫자 타입을 string타입으로 변환하여 비교를 한다.
- https://leavemymark.tistory.com/12 (stirng 간의 비교연산 블로깅)
- 요약하면 오름차순임에도 불구하고 문자열 '10'이 '3'보다 앞에 정렬된다.

2. 간단히 정렬 알아보기

- 핵심 : sort의 콜백함수가 음수를 리턴할 때 a가 먼저온다(a를 낮은 인덱스로 정렬한다). 양수를 리턴하면 b가 먼저온다.
    a. 예시
    const sortArray = [1, 9, 2, 8, 3, 7, 4, 6, 5];
    const test = sortArray.sort((a, b) => {
      console.log(a, b);
      return a - b;
    });
    console.log(test);



        i. 첫 번째 정렬에서 9와 1을 비교한다. a는 9, b는 1이다. a-b > 0(양수)이므로 b가 a보다 낮은 인덱스로 정렬된다.
        ii. 두 번째는 a=2, b=9다. a-b<0이므로 a가 b보다 낮은 인덱스로 정렬된다. //여기까지 [1,2,9]인 상태
        iii. 세 번째에 왜 2,9를 다시 비교했는지는 모른다.(내부 알고리즘이 어떻게 되어 있는지 모르겠다.)
        iv. 네 번째 a=2, b=1이다. a-b>0이므로 a가 b보다 앞에 정렬된다. 이런식으로 정렬이 다 될 때까지 비교한다.

3. 문자열을 사전식으로 정렬하는 방법

    result.sort((a, b) => {
      if (a > b) return 1;
      return -1;
    });
    문자열간의 대소관계를 비교하면 자동으로 아스키코드의 크기대로 문자열을 비교한다. sort함수의 인자인 콜백함수가 양수를 반환하면 b가 먼저오고(내림차순), 음수를 반환하면 a가 먼저온다.(오름차순) 0을 반환하면 정렬하지 않는다.