ballqs 님의 블로그

[Java] 프로그래머스 문제 - 유연근무제 본문

코딩 공부/Java

[Java] 프로그래머스 문제 - 유연근무제

ballqs 2025. 9. 1. 14:14

오늘 풀어본 문제는 프로그래머스의 유연근무제 이라는 문제를 풀어보았다.


문제 설명

프로그래머스 사이트를 운영하는 그렙에서는 재택근무와 함께 출근 희망 시각을 자유롭게 정하는 유연근무제를 시행하고 있습니다. 제도 정착을 위해 오늘부터 일주일 동안 각자 설정한 출근 희망 시각에 늦지 않고 출근한 직원들에게 상품을 주는 이벤트를 진행하려고 합니다.

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

당신은 직원들이 설정한 출근 희망 시각과 실제로 출근한 기록을 바탕으로 상품을 받을 직원이 몇 명인지 알고 싶습니다.

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


제한 사항

  • 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는 화요일, 3은 수요일, 4는 목요일, 5는 금요일, 6은 토요일, 7은 일요일에 이벤트를 시작했음을 의미합니다.
  • 출근 희망 시각과 실제로 출근한 시각을 100으로 나눈 나머지는 59 이하입니다.

입출력 예

schedules timelogs startday result
[700, 800, 1100] [[710, 2359, 1050, 700, 650, 631, 659], [800, 801, 805, 800, 759, 810, 809], [1105, 1001, 1002, 600, 1059, 1001, 1100]] 5 3
[730, 855, 700, 720] [[710, 700, 650, 735, 700, 931, 912], [908, 901, 805, 815, 800, 831, 835], [705, 701, 702, 705, 710, 710, 711], [707, 731, 859, 913, 934, 931, 905]] 1 2

입출력 예 설명

입출력 예 #1

이벤트를 시작한 날은 금요일입니다. 직원 3명의 일주일 간 출근 시각을 나타내면 다음과 같습니다.

출근 희망 시각 출근 인정 시각
7:00 7:10
8:00 8:10
11:00 11:10

 

7:10 23:59 10:50 7:00 6:50 6:31 6:59
8:00 8:01 8:05 8:00 7:59 8:10 8:09
11:05 10:01 10:02 6:00 10:59 10:01 11:00

모든 직원이 평일에 늦지 않고 출근했습니다. 따라서 상품을 받을 직원은 3명입니다.


풀이 과정

문제를 보자마자 아래와 같이 생각하여 풀자고 생각했다.

  1. schedules 의 길이 별로 반복문을 돌림
  2. 직원 별 희망 출근 시간 구하기
    1. 만약 minute의 값이 10분을 더 했을 때 60분을 넘길 경우 시간 재 계산 하기
  3. timelogs 의 기록과 희망 출근 시간과의 비교를 위한 반복문 구현
    1. 시작 날짜를 바탕으로 토요일 , 일요일이 언제인지 알기 위한 값 구하기
    2. 출근 희망 시간보다 더 늦게 기록이 찍힌 경우 반복문 빠져나가기! break
  4. 직원 별 출근에 이상 없을 경우 결과값 증가처리

코드

import java.util.*;

class Solution {
    public int solution(int[] schedules, int[][] timelogs, int startday) {
        int answer = 0;
        for (int i = 0; i < schedules.length; i++)
        {
            // 직원 별 희망 출근 시간
            int desiredtime = schedules[i];
            // 시간 , 분을 추려내어 10분 더하기
            int hour = desiredtime / 100;
            int minute = desiredtime % 100 + 10;
            
            // 10분 추가 했을 시 60분을 넘길 경우
            if (minute >= 60)
            {
                minute -= 60;
                hour++;
            }
            // 출근 희망시간 재설정
            desiredtime = hour * 100 + minute;
            
            // 이벤트 당첨 여부
            boolean flag = true;
            
            for (int j = 0 , k = 0; j < 7; j++)
            {
                // 시작날짜 - 1 + 더하는 값에 7를 나머지 값 구하여 + 1 처리
                int n = (startday - 1 + k++) % 7 + 1;
                if ( n == 6 || n == 7 ) continue; // 토요일 , 일요일 SKIP
                if( desiredtime < timelogs[i][j] ) // 출근 희망 시간보다 더 늦게 기록이 찍힌 경우
                {
                    flag = false;
                    break;
                }
            }
            
            // 이벤트 당첨된 경우 결과값 증가
            if (flag) answer++;
        }
        
        return answer;
    }
}

이 문제는 startday 값이 생각지도 못한 복병 이였다. 어떻게 풀어야 할지 계속 고민하며 계산 식에 많이 해맸다. 다른 문제도 이런 적이 많았는데 역시… 수학 계산이 가장 어려운 거 같다…