와드의 블로그

유연근무제 본문

PS/프로그래머스

유연근무제

Ward 2026. 4. 2. 17:58

문제

직원들이 일주일 동안 자신이 설정한 출근 희망 시각 + 10분 이내에 출근하는 이벤트를 진행합니다. 단, 토요일과 일요일의 출근 시각은 이벤트에 영향을 끼치지 않습니다. 직원들의 출근 희망 시각과 실제 출근 기록, 이벤트를 시작한 요일이 주어질 때 상품을 받을 직원이 몇 명인지 구하는 프로그램을 작성하는 문제입니다. 모든 시각은 시에 100을 곱하고 분을 더한 정수 형식(예: 9시 58분 -> 958)으로 주어집니다.

  • 입력: * 직원 n명이 설정한 출근 희망 시각 schedules (1차원 배열)
    • 일주일 동안의 실제 출근 시각 timelogs (2차원 배열)
    • 이벤트를 시작한 요일 startday (1: 월, 2: 화, 3: 수, 4: 목, 5: 금, 6: 토, 7: 일)
  • 출력: 상품을 받을 직원의 수를 반환합니다.

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

풀이: 요일 판별 및 시간 올림을 활용한 구현

정수형으로 주어지는 시간을 시와 분으로 올바르게 분리하여 더하고, 주말을 제외하는 조건 분기가 핵심인 시뮬레이션 문제입니다.

  • 주말(토, 일) 제외: 이벤트를 시작한 요일 startday에 현재 일차 j(0~6)를 더한 뒤 7로 나눈 나머지(modDay)를 구합니다. 나머지가 6이면 토요일, 0이면 일요일이 되므로, modDay == 0 || modDay == 6인 경우에는 출근 시각을 검사하지 않고 무시(continue)합니다.
  • 인정 시각 계산 (60분 초과 처리): 출근 희망 시각에 10분을 더했을 때(tmp = schedules[i] + 10), 분(minute) 단위가 60을 넘어가면 시(hour)를 올려주어야 합니다.
    • 분 추출 및 판별: tmp % 100이 60 이상인지 확인합니다.
    • 초과한 경우: 시(hour)는 tmp / 100 + 1로 계산하고, 분(minute)은 tmp % 100 % 60으로 보정하여 새로운 한계 시각(tmp)을 재조립합니다.
  • 지각 여부 판별: 최종 인정 시각 tmp가 실제 출근 시각 timelogs[i][j]보다 작다면 이벤트에 실패한 것이므로 flag를 false로 바꾸고 다음 사람으로 넘어갑니다(break).
  • 일주일 동안 한 번도 지각하지 않아 flag가 true로 유지된 직원의 수만 정답에 누적하여 반환합니다.

코드

class Solution {
    public int solution(int[] schedules, int[][] timelogs, int startday) {
        int ans = 0;
        
        for (int i = 0; i < schedules.length; i++) {
            boolean flag = true;
            
            for (int j = 0; j < 7; j++) {
                // 요일 계산: 6은 토요일, 0은 일요일
                int modDay = (startday + j) % 7;
                if (modDay == 0 || modDay == 6) continue;
                
                // 인정 한계 시각 (희망 시각 + 10분)
                int tmp = schedules[i] + 10;
                
                // 분(minute)이 60을 초과하는 경우 시(hour) 올림 처리
                if (tmp % 100 >= 60) {
                    int m = tmp % 100 % 60;
                    int h = tmp / 100 + 1;
                    tmp = h * 100 + m;
                }
                
                // 실제 출근 시각이 인정 시각보다 늦은 경우 지각 처리
                if (tmp < timelogs[i][j]) {
                    flag = false;
                    break;
                }
            }
            
            // 지각을 한 번도 하지 않은 경우
            if (flag) {
                ans++;
            }
        }
        
        return ans;
    }
}

알고리즘 분류

구현 (Implementation), 시뮬레이션 (Simulation), 수학 (Mathematics)

'PS > 프로그래머스' 카테고리의 다른 글

노란불 신호등  (0) 2026.04.02
택배 상자 꺼내기  (0) 2026.04.02
교점에 별 만들기  (1) 2026.03.13
피로도  (0) 2026.03.12
신규 아이디 추천  (0) 2026.03.12