끄적끄적 코딩
728x90

문제 설명

회사에서는 유연근무제를 시행하며, 직원들이 설정한 출근 희망 시각에 맞춰 출근하면 상품을 제공하는 이벤트를 진행한다.
직원들은 설정한 출근 희망 시각 + 10분까지 출근해야 하며, 토요일과 일요일은 이벤트 대상에서 제외된다.
모든 시각은 시에 100을 곱하고 분을 더한 정수로 표현되며, 이를 기반으로 상품을 받을 수 있는 직원의 수를 구한다.


제한 사항

  • 직원 수: 1 ≤ n ≤ 1,000
  • 출근 희망 시각 범위: 700 ≤ schedules[i] ≤ 1100
  • 출근 기록 시각 범위: 600 ≤ timelogs[i][j] ≤ 2359
  • 이벤트 시작 요일: 1 ≤ startday ≤ 7 (1: 월요일, 7: 일요일)

해결 방법

알고리즘: 구현, 배열 탐색

  1. 각 직원의 출근 허용 시간(출근 희망 시각 + 10분)을 계산한다.
    • 분 단위에서 60을 초과하면 시간을 조정한다.
  2. 이벤트 기간 동안 직원들의 출근 기록을 확인한다.
    • 해당 요일이 토요일(6) 또는 일요일(0)인 경우 제외한다.
    • 그 외 요일에서 출근 허용 시간을 초과하면 해당 직원은 제외한다.
  3. 모든 평일 동안 출근 허용 시간 내에 출근한 직원 수를 반환한다.

시간 복잡도

  • 직원별로 일주일간의 출근 기록을 확인해야 하므로 O(n)
  • 각 직원의 출근 시간 검증에 대해 7일을 순회하므로 O(n × 7) = O(n)
  • 최악의 경우 n = 1,000일 때 O(7,000) ≈ O(n)

구현 코드

function solution(schedules, timelogs, startday) {
  let answer = 0;

  timelogs.forEach((logs, index) => {
    let timeLimit = schedules[index] + 10;
    let hour = Math.floor(timeLimit / 100);
    let minute = timeLimit % 100;

    if (minute >= 60) {
      hour += 1;
      minute -= 60;
    }
    timeLimit = hour * 100 + minute;

    const isValid = logs.every((time, day) => {
      const curDay = (day + startday - 1) % 7;
      return curDay === 5 || curDay === 6 || time <= timeLimit;
    });

    if (isValid) answer++;
  });

  return answer;
}

검색 태그