알고리즘

99클럽 코테 스터디 17일차 TIL + 프로그래머스 유연근무제 문제 풀이

개발공명 2025. 4. 23. 08:59

오늘의 문제 

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제 풀이

간단한 문제 요약은 아래와 같다. 

    일주일 간 설정한 출근 희망 시각에 늦지 않은 직원에게 상품 이벤트
    직원들 출근 희망 시각 + 10분까지 출근해야 함
    토, 일요일은 이벤트에 영향 X
    매일 한번 어플로 출근
    시간은 10:13 -> 1013 이렇게 표현
    
    설정한 출근 희망 시각과 실체 출근 기록 주어짐
    이것으로 상품 받을 직원 몇명인지 구하기
    
    n = 직원 명 수 
    schedules = 출근 희망 시각 1차원 배열
    timelogs = 일주일 간 출근한 시각 2차원 배열
    startday = 이벤트 시작한 요일

 

중요한 것은 아래와 같다.

  • 토, 일요일은 제외하기
  • 인정되는 시간 = +10분 하는 시간 구하기
  • 인정되는 시간 안에 들어왔는지 판별하기

 

이제 어떻게 풀었는지 보자. 

 

먼저 토요일, 일요일의 index를 구했다. 

보면 startday가 5라면 금요일부터 시작하는 것으로 schedules, timelogs의 0번 index가 금요일이다. 

따라서 1, 2 index가 토요일, 일요일이다. 

이렇게 토요일, 일요일 index를 구하고 계산할 때 무시해야 한다. 

 

그래서 처음에는 위의 예제만 보고 아래처럼 구하면 되겠다고 생각하였다. 

startday -> 7-startday = 일요일, 6-startday = 토요일

 

그런데 생각해보니 startday가 일요일이면 즉 7이면 위의 식에는 문제가 생긴다. 

index가 음수가 나오는 경우가 생긴다. 

그래서 일요일 일 때는 따로 빼줘야 한다. 

코드에서는 왜 토요일 또 따로 뺐는지 모르겠다 허허.

    int saturdayIndex=0; 
    int sundayIndex=0;
    
    // 토요일, 일요일 index 구하기
    if(startday<=5){
        saturdayIndex = 6-startday;
        sundayIndex = 7-startday;    
    }
    else if(startday==6){
        saturdayIndex = 0;
        sundayIndex = 1;
    }
    else{
        saturdayIndex = 6;
        sundayIndex = 0;
    }

 

이제 각 인원의 출근 희망 시각을 보면서 확인하면 된다. 

여기에서 인정되는 시간 즉 10분을 추가했다. 

 

왜냐하면 아래에서 출근 시간이 출근 희망 시각 + 10보다 작은지 판별하려고 하니 문제가 많았다. 

코드에서 볼 수 있듯이 출근 희망 시각이 10시 51분 이런 경우에 minute를 판별할 때 어지러워진다.

그래서 아예 먼저 10분을 더한 시간을 구해 놓았다. 

    for(int i=0;i<schedules.size();i++){
        int wantHour = schedules[i]/100;
        int wantMinute = schedules[i]%100;
        
        // 인정되는 시간 구하기 (+10분)
        if(wantMinute>=50){
            wantHour++;
            wantMinute-=50;
        }
        else{
            wantMinute+=10;
        }

 

이제 timelogs 배열 = 실제 출근 시간들을 보며 각 시간이 위에서 구한 출근 희망 시각 + 10분보다 작은지 확인하면 된다. 

위에서 구한 토요일, 일요일 index인 경우 continue 했다. 

그리고 실제 출근 시간이 위에서 구한 출근 희망 시각 + 10분보다 작다면 safeDay++ 했다. 

그래서 safeDay가 5이면 answer를 1 올렸다. 

        int safeDay = 0;
        
        // 일주일 출근 시간 확인
        for(int j=0;j<7;j++){
            // 토요일, 일요일이면 pass
            if(j==saturdayIndex || j==sundayIndex){
                continue;
            }
            
            // 통과한 날 찾기
            int todayHour = timelogs[i][j]/100;
            int todayMinute = timelogs[i][j]%100;
            
            if(wantHour>todayHour
               ||(wantHour==todayHour&&wantMinute>=todayMinute)){
                safeDay++;
            }
        }
        
        // 5일 이상 통과면 추가
        if(safeDay==5){
            answer++;
        }
    }

 

 

전체 코드

#include <iostream>
#include <string>
#include <vector>

using namespace std;

/*
    일주일 간 설정한 출근 희망 시각에 늦지 않은 직원에게 상품 이벤트
    직원들 출근 희망 시각 + 10분까지 출근해야 함
    토, 일요일은 이벤트에 영향 X
    매일 한번 어플로 출근
    시간은 10:13 -> 1013 이렇게 표현
    
    설정한 출근 희망 시각과 실체 출근 기록 주어짐
    이것으로 상품 받을 직원 몇명인지 구하기
    
    n = 직원 명 수 
    schedules = 출근 희망 시각 1차원 배열
    timelogs = 일주일 간 출근한 시각 2차원 배열
    startday = 이벤트 시작한 요일
    
    startday -> 7-startday = 일요일, 6-startday = 토요일 timelogs index
*/

int solution(vector<int> schedules, vector<vector<int>> timelogs, int startday) {
    int answer = 0;
    
    int saturdayIndex=0; 
    int sundayIndex=0;
    
    // 토요일, 일요일 index 구하기
    if(startday<=5){
        saturdayIndex = 6-startday;
        sundayIndex = 7-startday;    
    }
    else if(startday==6){
        saturdayIndex = 0;
        sundayIndex = 1;
    }
    else{
        saturdayIndex = 6;
        sundayIndex = 0;
    }
    
    
    for(int i=0;i<schedules.size();i++){
        int wantHour = schedules[i]/100;
        int wantMinute = schedules[i]%100;
        
        // 인정되는 시간 구하기 (+10분)
        if(wantMinute>=50){
            wantHour++;
            wantMinute-=50;
        }
        else{
            wantMinute+=10;
        }
        
        int safeDay = 0;
        
        // 일주일 출근 시간 확인
        for(int j=0;j<7;j++){
            // 토요일, 일요일이면 pass
            if(j==saturdayIndex || j==sundayIndex){
                continue;
            }
            
            // 통과한 날 찾기
            int todayHour = timelogs[i][j]/100;
            int todayMinute = timelogs[i][j]%100;
            
            if(wantHour>todayHour
               ||(wantHour==todayHour&&wantMinute>=todayMinute)){
                safeDay++;
            }
        }
        
        // 5일 이상 통과면 추가
        if(safeDay==5){
            answer++;
        }
    }
    
    
    return answer;
}

 

회고

간단한 구현 문제라 다행히 풀 수 있었다. 

중점은 토, 일요일 index구하기 인정되는 시간을 구하는 것통과되는 시간을 판별하는 것이였다. 

바로 이전에 셔틀버스 문제에서 탈 수 있는 시간 체크하는 것을 해서 이번에는 다행히 오류 없이 시간 체크할 수 있었다. 

토, 일요일 index 구하기는 그냥 간단하게 생각했으면 틀렸을 것 같다.

다행히 한번 더 생각해서 넘어갈 수 있었던 것 같다.