문제
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번 정도 반복이라서 실행 시간 충분히 빠름
'Algorithm > Programmers' 카테고리의 다른 글
| [Programmers] Lv.1 | [PCCE 기출문제] 9번 / 지폐 접기 | Java (0) | 2025.11.07 |
|---|---|
| [Programmers] Lv.1 | [PCCP 기출문제] 1번 / 동영상 재생기 | Java (0) | 2025.11.06 |
| [Programmers] Lv.1 | 택배 상자 꺼내기 | Java (0) | 2025.11.06 |
| [Programmers] Lv.0 | 중복된 숫자 개수 | Java (0) | 2025.11.06 |
| [Programmers] Lv.0 | 머쓱이보다 키 큰 사람 | Java (0) | 2025.11.06 |
댓글