숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로그램을 작성하시오.
// NOTE: 입력
10
6 3 2 10 10 10 -10 -10 7 3
8
10 9 -5 2 3 4 5 -10
// NOTE: 출력
3 0 0 1 2 0 0 2
이 문제는 2가지 해결 방법이 있다.
문제가 나온 시점에는 Map 객체가 없었나??
풀면서 Map 객체
혹은 heap
의 탐색 속도가 빠르다는걸 체감했다.
Map을 쓰니까, 속도가 3배정도 빨라졌다.
이분탐색은 리스트 정렬, start, end, mid
네 가지가 정리되어야 한다!
이 문제는 target
을 찾고, 리스트에 target이 있으면 갯수를 없으면 0
을 반환하면 된다!
[카드 숫자, 갯수]
인 list를 만드는 과정에서 reduce
를 사용arr.push([카드 숫자, 갯수])
한다.상근이가 가진 카드를 개조한 list를 탐색할거다.
[카드 숫자, 갯수]
const getList = (arr) => {
const _sorted_arr = arr.trim().split(' ').sort((a, b) => +a - +b);
const _list = [[+_sorted_arr[0], 1]];
for (let i = 1; i < _sorted_arr.length; i++) {
const [_before, _count] = _list.pop();
const _cur = +_sorted_arr[i];
if (_before == _cur) {
_list.push([_before, _count + 1]);
continue;
}
_list.push([_before, _count], [_cur, 1]);
}
return _list;
};
구조분해 할당으로 target과 비교할 card 값을 추출
const _mid = Math.floor((start + end) / 2);
const [_card, _count] = list[_mid];
start > end 인 경우
target == card인 경우
target > card인 경우
target < card인 경우
// NOTE: inputs
let [, _inputs, , _cards] = require('fs')
.readFileSync('dev/stdin')
.toString()
.trim()
.split(/\n/);
// NOTE: solution
const binarySearch = (target, list, start, end) => {
if (start > end) return 0;
const _mid = Math.floor((start + end) / 2);
const [_card, _count] = list[_mid];
if (target == _card) return _count;
if (target > _card) return binarySearch(target, list, _mid + 1, end);
return binarySearch(target, list, start, _mid - 1);
}
const getList = (arr) => {
const _sorted_arr = arr.trim().split(' ').sort((a, b) => +a - +b);
const _list = [[+_sorted_arr[0], 1]];
for (let i = 1; i < _sorted_arr.length; i++) {
const [_before, _count] = _list.pop();
const _cur = +_sorted_arr[i];
if (_before == _cur) {
_list.push([_before, _count + 1]);
continue;
}
_list.push([_before, _count], [_cur, 1]);
}
return _list;
};
const _list = getList(_inputs);
const _end = _list.length - 1;
const _result = _cards.trim().split(' ').map(v => binarySearch(v, _list, 0, _end)).join(' ');
console.log(_result);
// NOTE: inputs
let [, _inputs, , _cards] = require('fs')
.readFileSync('dev/stdin')
.toString()
.trim()
.split(/\n/);
// NOTE: solution
const splitString = (str) => str.trim().split(' ');
const getMap = (input) => {
const _map = new Map();
for (let _card of splitString(input)) {
let _count = _map.has(_card) ? _map.get(_card) : 0;
_map.set(_card, _count + 1);
}
return _map;
};
const _searchMap = getMap(_inputs);
const _result = splitString(_cards)
.map(v => _searchMap.has(v) ? _searchMap.get(v) : 0)
.join(' ');
console.log(_result);