[2025/05/01]TIL

오수호·2025년 5월 1일

TIL

목록 보기
13/60

프로그래머스 코딩테스트 Lv. 1 유연 근무제

1. 문제설명

프로그래머스 사이트를 운영하는 그렙에서는 재택근무와 함께 출근 희망 시각을 자유롭게 정하는 유연근무제를 시행하고 있습니다. 제도 정착을 위해 오늘부터 일주일 동안 각자 설정한 출근 희망 시각에 늦지 않고 출근한 직원들에게 상품을 주는 이벤트를 진행하려고 합니다.

직원들은 일주일동안 자신이 설정한 출근 희망 시각 + 10분까지 어플로 출근해야 합니다. 예를 들어 출근 희망 시각이 9시 58분인 직원은 10시 8분까지 출근해야 합니다. 단, 토요일, 일요일의 출근 시각은 이벤트에 영향을 끼치지 않습니다. 직원들은 매일 한 번씩만 어플로 출근하고, 모든 시각은 시에 100을 곱하고 분을 더한 정수로 표현됩니다. 예를 들어 10시 13분은 1013이 되고 9시 58분은 958이 됩니다.

당신은 직원들이 설정한 출근 희망 시각과 실제로 출근한 기록을 바탕으로 상품을 받을 직원이 몇 명인지 알고 싶습니다.

직원 n명이 설정한 출근 희망 시각을 담은 1차원 정수 배열 schedules, 직원들이 일주일 동안 출근한 시각을 담은 2차원 정수 배열 timelogs, 이벤트를 시작한 요일을 의미하는 정수 startday가 매개변수로 주어집니다. 이때 상품을 받을 직원의 수를 return 하도록 solution 함수를 완성해주세요.


2. 제한사항

1 ≤ schedules의 길이 = n ≤ 1,000
schedules[i]는 i + 1번째 직원이 설정한 출근 희망 시각을 의미합니다.
700 ≤ schedules[i] ≤ 1100
1 ≤ timelogs의 길이 = n ≤ 1,000
timelogs[i]의 길이 = 7
timelogs[i][j]는 i + 1번째 직원이 이벤트 j + 1일차에 출근한 시각을 의미합니다.
600 ≤ timelogs[i][j] ≤ 2359
1 ≤ startday ≤ 7
1은 월요일, 2는 화요일, 3은 수요일, 4는 목요일, 5는 금요일, 6은 토요일, 7은 일요일에 이벤트를 시작했음을 의미합니다.
출근 희망 시각과 실제로 출근한 시각을 100으로 나눈 나머지는 59 이하입니다.


3. 시간복잡도 분석

직원의 수가 1000명일때 timelogs는 각 직원별로 7개의 배열을 가지므로 총 7000개의 int를 저장한다. 각각의 직원의 출근희망시간에 접근한 뒤 timelogs의 해당직원의 출근시간을 파악하기 위해 7번 접근하므로, O ( 1000 + 7000 ) => 8000 이다.


4. 문제해결 방법

직원이 출근희망시간의 +10분 이전의 시간에만 회사에 출근한다면, 이는 제 시간에 출근했다고 본다. 이제 시간을 저장하는 형식을 보면, hour*100 + minute 로 구성되어있음을 알 수 있다.
예를 들어, 7시 30분은 730이고 15시 45분은 1545가 된다.

위와같은 시간의 저장형식으로 봤을때, 직원의 희망출근시간 + 10 이 실제 출근 시간보다 작거나 같다면 해당 직원은 제 시간에 출근했다고 볼 수 있다. 왜냐하면, 시간의 저장형식을 봤을 때 hour끼리의 값으로 먼저 대소비교가 가능하고 이후 hour가 같으면 minute의 값으로 대소비교가 되기때문에 실제 시간을 비교하는 것과 같다고 볼 수 있기 때문이다.

그럼, 이제 나머지는 해당 직원의 출근희망시간에 10분을 더한 뒤 이를 이 문제의 시간저장형식으환산해주고 timelogs와 비교해서 이 직원이 회사에 늦었는 지 안늦었는 지를 판별한다.

그리고 회사에 늦었더라도, 회사에 늦은 날이 토요일 혹은 일요일이면 늦지 않은 것으로 판별하게 만들면 된다.


5. 실제코드


using System;

public class Solution {
    public int solution(int[] schedules, int[,] timelogs, int startday) {
        int answer = 0;
        int index = 0;
        
        foreach(int t in schedules)
        {
            bool isCorrect = true;
            
            int hour = t/100;
            int minute = t%100;
            
            int ru = (minute+10)/60;
            minute = (minute + 10)%60;
            
            hour += ru ;
            
            for(int i = 0; i<7;i++)
            {
                
                if((hour*100)+minute<timelogs[index,i])
                {   Console.WriteLine($"{hour*100+minute} : {timelogs[index,i]} : {hour+minute<timelogs[index,i]}");
                    
                 if((startday+i)%7==6 || (startday+i)%7==0 ) continue;
                    
                 isCorrect = false;
                 break;   
                    
                }
                
            }
            
            index++;
            if(isCorrect) answer++;
        }
        
        return answer;
    }
}

해당 코드에서 isCorrect는 직원이 일주일동안 주말을 제외하고 회사에 늦었는지 늦지않았는 지를 판별하고 늦지않았다면 최종적으로 return되는 answer을 1증가시켜준다.

profile
게임개발자 취준생입니다

0개의 댓글