본문 바로가기

취업/코딩테스트

프로그래머스 유연근무제

문제

 

정답

따로 직원 수 만큼의 배열을 두고

1. 토요일, 일요일을 체크해서 거르기

2. 출근한 시간 -10 보다 출근 희망 시간이 클경우만 배열에 더해주기

3. 지각하지 않은 날이 5가 넘는 직원만 더해서 출력하기

순서로 작성했다.

 

하지만 테스트 케이스에서 몇 가지 경우에 걸렸다.

따로 테스트 케이스를 만들어 실험해본 결과

2번에서 희망 출근 시간에 10을 더했을 때 정시를 넘어가는 경우를 제대로 거르지 못 했다.

 

따라서 출근 시간을 기준으로 빼는 것이 아닌 희망 출근 시간에 10을 더하고 조건에 따라 더하는 방식으로 변경했다.

1. 희망 출근 시간에 10을 더할 경우 정시를 넘는 경우

1-1. 희망 출근 시간보다 출근 시간이 더 빠른 경우(정확히 말하면 시가 희망 출근 시간과 같거나 적은 경우)

1-2. 희망 출근 시간보다 출근 시간의 시가 1만 큰 경우, 분을 비교

 

2. 더해도 넘지 않는 경우

2-1. 이 경우에는 단순히 전체 시간에 10을 더한 후 비교하면 된다.

 

위와 같은 경우로 나눠 따로 계산해주었다.

 

 

최종 제출한 정답

class Solution {
    public int solution(int[] schedules, int[][] timelogs, int startday) {
        int answer = 0;
        
        int[] answers = new int[schedules.length];
        
        for(int i=0; i<schedules.length; i++) {
            for(int j=0; j<timelogs[i].length; j++) {
                
                // 토요일, 일요일 제외
                if((startday+j)%7 == 6 || (startday+j)%7 == 0) {
                    continue;
                }
                
                // 직원별로 지각하지 않은 날만 더해주기
                int time = schedules[i]%100 + 10;
                if(time >= 60) { // 출근 희망 시간에 10분을 더하면 정시를 넘는 경우
                    if(schedules[i]/100 >= timelogs[i][j]/100) {answers[i] += 1;} // 출근 희망 시간의 시를 넘지 않으면 일찍 출근한 경우이므로 그냥 더해준다.
                    else if(schedules[i]/100+1 >= timelogs[i][j]/100) { // 출근 희망 시간의 시+1을 넘지 않으면서
                        if(time%60 >= timelogs[i][j]%100) {answers[i] += 1;} // 분이 10분을 더한 것보다 작은 경우만 더해주기
                    }
                } else if(schedules[i]+10 >= timelogs[i][j]) { // 출근 희망 시간에 10분을 더해도 정시를 넘기지 않는 경우
                    answers[i] += 1;
                }
            }
        }
        
        for(int k=0; k<answers.length; k++) {
            if(answers[k]>=5) {answer+=1;} // 5일 이상 지각하지 않은 직원만 더해주기
        }
        
        return answer;
    }
}