본문 바로가기

programmers

프로그래머스 [2025 프로그래머스 코드챌린지 1차 예선 / 유연근무제](C++) -yes6686- 티스토리

728x90
SMALL

프로그래머스 문제 풀이: 출퇴근 기록 검증


문제 링크: 문제 보기

문제 설명:

각 직원의 근무 일정과 출퇴근 기록이 주어질 때, 정해진 출근 시간보다 늦지 않게 출근한 직원의 수를 구하는 문제입니다. 근무 일정은 평일(월~금)만 적용되며, 주말(토, 일)에는 출퇴근 기록을 확인하지 않습니다.


문제 해결 코드


#include <string>
#include <vector>

using namespace std;

int solution(vector<int> schedules, vector<vector<int>> timelogs, int startday) {
    int answer = 0;

    for (int i = 0; i < timelogs.size(); i++) {
        bool isValid = true;
        int currentDay = startday;

        for (int j = 0; j < timelogs[i].size(); j++) {
            if (currentDay != 6 && currentDay != 7) { // 평일만 체크
                int scheduledTime = schedules[i] + 10;
                
                // 분 단위 조정 (ex: 09:60 → 10:00 변환)
                if (scheduledTime % 100 >= 60) {
                    scheduledTime += 40;
                }

                if (scheduledTime < timelogs[i][j]) { // 지각 여부 판단
                    isValid = false;
                    break;
                }
            }
            
            // 다음 요일 계산 (월~금: 1~5, 토: 6, 일: 7)
            currentDay = (currentDay % 7) + 1;
        }

        if (isValid) answer++;
    }

    return answer;
}

코드 설명

  • 핵심 알고리즘: 각 직원의 출근 시간을 기준으로 출퇴근 로그를 검사하여 지각 여부를 판단합니다.
  • 구현 세부사항:
    • 출근 일정은 분 단위 조정이 필요하며, 60분 이상이 되면 시간을 올림 처리합니다.
    • 주말(토, 일)에는 출퇴근 기록을 검사하지 않습니다.
    • 출퇴근 로그를 확인하며 지각한 경우 반복문을 즉시 종료합니다.
  • 시간 복잡도 분석:
    • 직원 수를 n, 출퇴근 로그 개수를 m이라 할 때, 총 탐색 시간은 O(n * m)입니다.

결과

이 코드는 각 직원의 출근 기록을 정확히 분석하여 정해진 출근 시간보다 늦지 않게 도착한 직원의 수를 반환합니다.

다른 접근 방식으로는 출근 시간을 미리 변환하여 배열로 저장한 후, 바이너리 서치를 활용해 탐색 시간을 최적화할 수도 있습니다.

728x90
LIST