본문 바로가기
알고리즘 문제/프로그래머스_Lv1 도장깨기

[프로그래머스] 유연근무제 (Javascript)

by 스코필 2025. 2. 25.

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/388351

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제 설명

그렙이라는 사이트는 재택근무와 함께 출근 희망 시각을 자유롭게 정하는 유연근무제를 시행중입니다. 오늘부터 일주일 동안 각자 설정한 출근 희망 시각에 늦지 않고 출근한 직원들에게 상품을 주려고 합니다.

직원들은 일주일동안 자신이 설정한 출근 희망 시각 + 10분 까지 어플로 출근해야 합니다. 단, 토요일, 일요일의 출근 시각은 이벤트에 영향을 끼치지 않습니다. 모든 시각은 시에 100을 곱하고 분을 더한 정수로 표현합니다. 예를 들어 10시 13분은 1013이 됩니다.

당신은 직원들이 설정한 출근 희망 시각을 담은 1차원 정수 배열 schedules, 직원들이 일주일 동안 출근한 시각을 담은 2차원 정수 배열 timelogs, 이벤트를 시작한 요일을 의미하는 정수 startday가 매개변수로 주어집니다. 이때 상품을 받을 직원의 수를 리턴하도록 함수를 완성하세요.

제한 사항

  • 1 <= schedules의 길이 = n <= 1,000
    • schedules[i]는 i + 1번째 직원이 설정한 출근 희망 시각을 의미합니다.
    • 700 <= schedules[i] <= 1100
  • 1 <= timelogs의 길이 = n <= 1,000
    • timelogs[i]의 길이 = 7
    • timelogs[i][j]는 i + 1번째 직원이 이벤트 j + 1일차에 출근한 시각을 의미합니다.
    • 600 <= timelogs[i][j] <= 2359
  • 1 <= startday <= 7
    • 1은 월요일, 2는 화요일, ... , 6은 토요일, 7은 일요일에 이벤트를 시작했음을 의미합니다.
  • 출근 희망 시각과 실제로 출근한 시각을 100으로 나눈 나머지는 59이하입니다.

 

❌ Code - 실패 (요일 설정)

function solution(schedules, timelogs, startday) {
    var answer = 0;
    
    function admitWork(time) {
        let hour = Math.floor(time / 100);
        let minute = time % 100 + 10;
        if (minute >= 60) {
            hour += 1;
            minute -= 60;
        }
        return hour * 100 + minute
    }
    
    for (let i = 0; i < timelogs.length; i++) {
        let tmp = 1;
        const schedule = admitWork(schedules[i]);
        
        let day = startday - 1;
        for (let j = 0; j < timelogs[i].length; j++) {
            if (day % 6 !== 0 && day % 7 !== 0) {
                if (timelogs[i][j] > schedule) {
                    tmp = 0;
                    break;
                }
            }
            
            day++;
        }
        
        answer += tmp;
    }
    
    return answer;
}

 

요일에 따른 조건식이 문제였다. 위의 코드처럼 하면 startday가 6(토요일)일 때, 2번째 토요일은 day의 변수가 13이 되어야 하지만 12일 때 조건을 진행하므로, 실제로 금요일에 이벤트가 발생하게 되어 오류가 나게 된다.

day 6 7 8 9 10 11 12 13
요일 토요일 일요일 월요일 화요일 수요일 목요일 금요일 토요일

 

문제를 해결하기 위해 staryday에 -1을 주고 0을 월요일, ... ,  6을 일요일로 가정하여 문제를 해결했다.

 

✅ Code - 성공

function solution(schedules, timelogs, startday) {
    var answer = 0;
    
    function admitWork(time) {
        let hour = Math.floor(time / 100);
        let minute = time % 100 + 10;
        if (minute >= 60) {
            hour += 1;
            minute -= 60;
        }
        return hour * 100 + minute
    }
    
    for (let i = 0; i < timelogs.length; i++) {
        let tmp = 1;
        const schedule = admitWork(schedules[i]);
        let day = startday - 1;
        for (let j = 0; j < timelogs[i].length; j++) {
            if (day !== 5 && day !== 6) {
                if (timelogs[i][j] > schedule) {
                    tmp = 0;
                    break;
                }
            }
            day = (day + 1) % 7;
        }
        answer += tmp;
    }
    
    return answer;
}