[리트코드] 1604 - javascript

Yongwoo Cho·2022년 5월 3일
0

알고리즘

목록 보기
87/104
post-thumbnail
post-custom-banner

📌 문제

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

profile
Frontend 개발자입니다 😎
post-custom-banner

0개의 댓글