📑 1. 문제설명


💡 2. 접근방식
1. 평일 체크
startday를 기준으로 평일(월~금)의 인덱스를 isWeekday 배열에 저장한다. (틀림) - 인덱스가 고정됨- startday + j를 통해 현재 요일을 직접 계산해서 startday에 따라 요일이 동적으로 변하게 해야 한다.
- % 7 연산으로 월금(15)만 검사하고 주말(0,6)은 출근시간 체크에서 제외하도록 한다.
2. 직원별 출근 기록 확인
- schedules[i] + 10을 기준으로 평일의 출근 기록을 확인한다. - 이 때 시간이 60분이 넘어가는 경우 +40을 해서 HHMM맞게 시간이 표시될 수 있도록 정확한 시간 보정을 해 준다.
- 하나라도 지각한 경우(출근 시각 > 인정 시각), 해당 직원은 상품을 받을 수 없다.
- 모든 평일을 지각하지 않았다면 카운트한다.
🙅🏻❌ 첫 시도 실패
class Solution {
public int solution(int[] schedules, int[][] timelogs, int startday) {
int n = schedules.length;
int count = 0;
// 평일(월~금)의 인덱스 찾기 (0-based 그리고 0번 인덱스는 월요일)
boolean[] isWeekday = new boolean[7];
int firstWeekday = (startday - 1) % 7;
for (int i = 0; i < 7; i++) {
isWeekday[(firstWeekday + i) % 7] = true;
}
// 직원별 체크
for (int i = 0; i < n; i++) {
int targetTime = schedules[i] + 10;
boolean allOnTime = true;
for (int j = 0; j < 7; j++) {
if (isWeekday[j] && timelogs[i][j] > targetTime) {
allOnTime = false;
break; // 주말 (토일)은 출근시간 검사 안해도 되니까
}
}
if (allOnTime) count++;
}
return count;
}
}
🙅🏻❌ 두 번째 시도 실패
시간 형식을 고려하지 않음
현재 시간이 HHMM 형식으로 카운팅 되기 때문에 출근 희망 시간 +10 한 후, 60분이 넘어가면 +40을 추가하여 올바른 시각을 유지하는 plusTime 메서드를 추가하였다.
예를 들면 plusTime(1055) 일 때, 1055 + 10 = 1065 이지만 '65분'은 시간을 읽는 올바른 표현이 아니기 때문에 +40을 추가하여 1065 → 1105로 변환한다. 그럼 10시 65분 대신 11시 05분으로 올바른 형식이 된다.
하지만 이 코드도 첫 번째 케이스는 통과하지 못함.
class Solution {
public int solution(int[] schedules, int[][] timelogs, int startday) {
int n = schedules.length;
int count = 0;
// 평일(월~금)의 인덱스 찾기
boolean[] isWeekday = new boolean[7];
int firstWeekday = (startday - 1) % 7;
for (int i = 0; i < 7; i++) {
isWeekday[(firstWeekday + i) % 7] = true;
}
// 직원별 체크
for (int i = 0; i < n; i++) {
int targetTime = plusTime(schedules[i]);
boolean allOnTime = true;
for (int j = 0; j < 5; j++) {
if (isWeekday[j] && timelogs[i][j] > targetTime) {
allOnTime = false;
break;
}
}
if (allOnTime) count++;
}
return count;
}
public int plusTime(int time) {
time += 10;
if (time % 100 >= 60) {
time += 40;
}
return time;
}
}
문제 발생 부분
for (int i = 0; i < n; i++) {
int targetTime = moreTime(schedules[i]);
boolean allOnTime = true;
for (int j = 0; j < 7; j++) { // ❌ 문제 발생 부분
if (isWeekday[j] && timelogs[i][j] > targetTime) {
allOnTime = false;
break;
}
}
if (allOnTime) count++;
}
❌ for (int j = 0; j < 7; j++) 사용 j=0부터 일요일을 검사하므로, startday가 반영되지 않음 ❌ 요일 오류 발생
- timelogs[i][j]의 j가 무조건 0~6으로 고정됨
- ]timelogs[i][j]에서 j=0~6까지 전체 순회하면, startday에 따른 요일 보정이 없음
- 즉, timelogs[i][0]이 항상 일요일 데이터를 가리키는 문제가 발생할 가능성이 있음
그래서 처음에 내가 isWeekday를 사용한 방식이 잘못되었다.
내가 쓴 isWeekday 배열로 계산하면 만약에 startday =3 (수요일) 일 때

j=0 → 일요일 (틀림)
j=1 → 월요일 (맞음)
j=2 → 화요일 (맞음)
j=3 → 수요일 (맞음)
j=4 → 목요일 (맞음)
j=5 → 금요일 (맞음)
j=6 → 토요일 (틀림)
이 때, j=0이 무조건 일요일을 검사하기 때문에 요일이 맞지 않는다.
✔️ 수정한 코드
isWeekday 배열을 사용하지 않고, startday + j를 통해 현재 요일을 직접 계산해서 startday에 따라 요일이 동적으로 변하게 해야 한다. 또 여기에 % 7 연산으로 월금(1,5)만 검사하고 주말(0,6)은 출근시간 조회에서 제외하도록 한다.
for (int j = 0; j < timelogs[i].length; j++) { // 올바른 코드
if ((startday + j) % 7 > 0 && (startday + j) % 7 < 6) { // 월(1)~금(5)만 검사
if (timelogs[i][j] > targetTime) {
allOnTime = false;
break;
}
}
}
위 코드대로 하면 startday = 3 (수요일) 일 때,
j = 0 → (3+0) % 7 = 3 (수요일)
j = 1 → (3+1) % 7 = 4 (목요일)
j = 2 → (3+2) % 7 = 5 (금요일)
j = 3 → (3+3) % 7 = 6 (토요일) ❌ (검사 안 함)
j = 4 → (3+4) % 7 = 0 (일요일) ❌ (검사 안 함)
startday부터 검사하면서 요일이 변함
- j=0~2 → 수~금 검사 ✅
- j=3,4 → 주말이라 검사 안 함 ❌
⭐ 3. 정답코드
class Solution {
public int solution(int[] schedules, int[][] timelogs, int startday) {
int n = schedules.length;
int count = 0;
// 직원별 체크
for (int i = 0; i < n; i++) {
int targetTime = moreTime(schedules[i]);
boolean allOnTime = true;
for (int j = 0; j < timelogs[i].length; j++) {
if ((startday + j) % 7 > 0 && (startday + j) % 7 < 6) {
if (timelogs[i][j] > targetTime) {
allOnTime = false;
break;
}
}
}
if (allOnTime) count++;
}
return count;
}
public int moreTime(int time) {
time += 10;
if (time % 100 >= 60) {
time += 40;
}
return time;
}
}
👏🏻 좋아요 가장 많이 받은 코드
import java.util.*;
import java.util.stream.IntStream;
class Solution {
public int solution(int[] schedules, int[][] timeLogs, int startDay) {
return (int) IntStream.range(0, timeLogs.length)
.filter(i -> IntStream.range(0, timeLogs[i].length).filter(idx -> timeLogs[i][idx] > (schedules[i] + ((schedules[i] % 100 > 49) ? 50 : 10)) && !(idx == 6 - startDay % 7 || idx == 7 - startDay)).count() == 0)
.count();
}
}
'코딩테스트 > JAVA테스트' 카테고리의 다른 글
| [프로그래머스] (Java) 크레인 인형 뽑기 게임 (스택) (9) | 2025.02.18 |
|---|---|
| [코딩테스트] (Java) 십진수를 이진수로 변환하기 (스택) (17) | 2025.02.17 |
| [프로그래머스] (Java) 오픈채팅방 문제풀이 (2) | 2025.02.11 |
| [프로그래머스] (Java) 문자열 섞기, 두 수의 연산값 비교하기 (16) | 2025.02.06 |
| [프로그래머스] (Java) 문자열 섞기 (15) | 2025.02.06 |