Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- next/Image
- Node js
- 백준
- nodejs
- CSS
- 재귀함수
- MUI
- 이벤트 루프
- 정규표현식
- 유데미
- kakao map api
- 자료구조
- Native select
- sort
- input class
- 코드스테이츠 메인프로젝트
- 버블정렬
- react js
- 코딩테스트
- 백준 nodeJS
- 자바스크립트
- 배열
- javascript
- 프론트엔드
- primitive type
- 알고리즘
- OSI 7계층
- 코드스테이츠
- 페이지네이션
- JavaScript Deep Dive
Archives
- Today
- Total
신입 개발자에서 시니어 개발자가 되기까지
[백준 nodeJs] 1764 듣보잡(feat. sort메서드) 본문
문제
김진영이 듣도 못한 사람의 명단과, 보도 못한 사람의 명단이 주어질 때, 듣도 보도 못한 사람의 명단을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 듣도 못한 사람의 수 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을 반환하면 정렬하지 않는다.
'javascript > 알고리즘' 카테고리의 다른 글
[백준 nodeJS] 18258 큐2 (0) | 2022.10.19 |
---|---|
[백준 nodeJS] 1269번 대칭 차집합 (0) | 2022.10.14 |
[백준 nodeJS] 1712 손익분기점(parseInt는 버림 용도가 아니다) (1) | 2022.10.12 |
[백준 nodeJS] 10815 숫자 카드(이분탐색) (0) | 2022.10.11 |
[백준 nodeJS] 브루트포스 2231 분해합 (0) | 2022.10.10 |