https://leetcode.com/problems/alert-using-same-key-card-three-or-more-times-in-a-one-hour-period/
const changeTime = (timeStr) => {
const [hour, min] = timeStr.split(':').map(Number);
return hour * 60 + min;
};
function solution(names, times) {
let ans = [];
let map = new Map();
for (let i = 0; i < times.length; i++) {
if (map.has(names[i])) {
let arr = map.get(names[i]);
map.set(names[i], [...arr, changeTime(times[i])]);
} else {
map.set(names[i], [changeTime(times[i])]);
}
}
let sortMap = [...map.entries()].map((item) => [item[0], [...item[1].sort((a, b) => a - b)]]);
sortMap.forEach(([name, timeRecord]) => {
for (let i = 0; i < timeRecord.length - 2; i++) {
if (timeRecord[i + 2] <= timeRecord[i] + 60) {
ans.push(name);
break;
}
}
});
return ans.sort();
}
✔ 알고리즘 : 구현
✔ Map 자료구조를 사용하여 사용자 이름에 따른 입장시간을 기록하였다.
✔ 시간계산을 편하기 하기 위해 HH:MM 를 변환하는 함수를 만들어서 구현하였다.
const changeTime = (timeStr) => {
const [hour, min] = timeStr.split(':').map(Number);
return hour * 60 + min;
};
✔ Map에 저장시키면 시간이 정렬되어있지 않는 상태로 들어갈 수 있으므로 들어온 시간을 오름차순으로 정렬하였다.
let sortMap = [...map.entries()].map((item) => [item[0], [...item[1].sort((a, b) => a - b)]]);
✔ Map을 순회하며 현재 index에서 2 증가시킨 timeRecord[i+2]가 현재 timeRecord[i]에서 60 증가 시킨 숫자보다 작다면 한시간 안에 3번 출입한 것이므로 ans에 넣어준다.
✔ 난이도 : 리트코드 기준 Medium