본문 바로가기
Algorithm/Programmers

[Programmers] Lv.1 | 유연근무제 | Java

by unknownomad 2025. 11. 6.

문제

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

 

풀이

class Solution {
    public int solution(int[] schedules, int[][] timelogs, int startday) {
        int n = schedules.length; // 직원 수
        int answer = 0;           // 상품 받을 직원 수

        for (int i = 0; i < n; i++) { // 직원 한 명씩 확인
            int hope = schedules[i];  // i번째 직원의 출근 희망 시간, 예: 930
            int hopeH = hope / 100;   // 시간 부분 추출, 예: 9
            int hopeM = hope % 100;   // 분 부분 추출, 예: 30

            // 출근 인정 시간 = 희망 시간 + 10분
            int limitH = hopeH;
            int limitM = hopeM + 10;

            // 만약 분이 60 이상이면 1시간 올리고 분에서 60 빼기
            if (limitM >= 60) {
                limitH += 1;
                limitM -= 60;
            }

            // 최종 인정 시간: 시*100 + 분
            int limit = limitH * 100 + limitM;

            boolean success = true; // 상품 받을 수 있는지 체크

            for (int j = 0; j < 7; j++) { // 7일치 출근 기록 확인
                // 현재 j일차가 무슨 요일인지 계산
                // startday = 이벤트 시작 요일(1=월요일)
                // j=0이면 startday, j=1이면 그 다음 날 ...
                int day = (startday + j - 1) % 7 + 1;

                // 토요일(6), 일요일(7)은 출근 체크 안함
                if (day == 6 || day == 7) continue;

                // 평일인데 실제 출근 시간 > 허용 시간이면 상품 대상 아님
                if (timelogs[i][j] > limit) {
                    success = false;
                    break; // 더 볼 필요 없음
                }
            }

            // 모든 평일에 늦지 않았다면 상품 받을 수 있음
            if (success) answer++;
        }

        return answer; // 최종 상품 받을 직원 수
    }
}

 

1️⃣ int day = (startday + j - 1) % 7 + 1; 의 의미

이 부분은 이벤트 시작 요일(startday) 기준으로 7일차 반복 중 현재 요일을 계산하는 식

  • startday : 이벤트 시작 요일 (1=월요일, 7=일요일)
  • j : 0부터 6까지 반복 (일주일)
  • (startday + j - 1) : startday를 기준으로 j일 뒤를 0-index처럼 맞춤
  • % 7 : 7로 나눈 나머지를 구해서 요일을 1~7 범위로 순환시키기
  • + 1 : 1~7 요일 번호로 맞추기

예시:

  • startday = 5 (금요일)
  • j = 0 → (5 + 0 - 1) % 7 + 1 = 4 % 7 + 1 = 5 → 금요일
  • j = 1 → (5 + 1 - 1) % 7 + 1 = 5 % 7 + 1 = 6 → 토요일
  • j = 2 → (5 + 2 - 1) % 7 + 1 = 6 % 7 + 1 = 7 → 일요일
  • j = 3 → (5 + 3 - 1) % 7 + 1 = 7 % 7 + 1 = 1 → 월요일

즉, 일주일 배열 인덱스를 실제 요일로 변환하는 역할
이걸로 토/일요일을 제외하고 평일만 체크할 수 있음

 

2️⃣ 시간복잡도 판단

시간복잡도는 루프 반복 횟수를 기준으로 판단함

코드를 보면:

 
for (int i = 0; i < n; i++) {        // 직원 n명 반복
    for (int j = 0; j < 7; j++) {    // 7일 반복
        // 평일 체크 및 지각 판단
    }
}
  • 외부 루프: 직원 수 n (1 ≤ n ≤ 1000)
  • 내부 루프: 일주일 7일 (고정)
  • 따라서 전체 반복 횟수 ≈ n × 7
  • 상수 7은 무시할 수 있으므로 O(n) 으로 평가 가능

즉, n이 1000이어도 7000번 정도 반복이라서 실행 시간 충분히 빠름

댓글