프로그래머스 유연근무제 풀이: 시간 변환과 요일 판별
작성자: solve together · 작성 언어: Python
0. 문제 링크와 출처
- 문제: 유연근무제
- 출처: 프로그래머스, 2025 프로그래머스 코드챌린지 1차 예선
- 자체 판단 난이도: Level 1
문제 원문과 제한 조건은 변경될 수 있으므로 제출 전에는 공식 문제 페이지를 다시 확인하세요.
1. 문제 요약
직원마다 출근 희망 시간이 정해져 있고, 희망 시간에서 10분 늦은 시각까지 출근하면 이벤트 조건을 만족합니다. 일주일 동안 출근 기록이 주어질 때, 상품을 받을 수 있는 직원 수를 구합니다.
단, 이벤트 시작 요일에 따라 일주일의 날짜가 달라지고 토요일과 일요일의 출근 기록은 평가에서 제외합니다.
시간은 9시 58분을 958, 10시 13분을 1013처럼 시 * 100 + 분으로 표현합니다. 따라서 숫자를 그대로 더하면 안 됩니다. 958 + 10 = 968은 실제 시각으로 존재하지 않기 때문입니다.
2. 문제 해결에 사용되는 알고리즘이나 자료구조 설명
시간 단위를 분으로 변환
HHMM 형식의 시간을 실제 분으로 바꾸면 덧셈과 비교를 안전하게 할 수 있습니다.
hour = time // 100
minute = time % 100
total = hour * 60 + minute
예를 들어 958은 9 * 60 + 58 = 598분이고, 여기에 10분을 더하면 608분, 즉 10시 8분이 됩니다.
요일 판별
startday는 월요일을 1, 일요일을 7로 표현합니다. 이벤트의 day번째 기록에 해당하는 요일은 다음처럼 구할 수 있습니다.
weekday = (startday - 1 + day) % 7
이때 0부터 세었을 때 토요일은 5, 일요일은 6입니다. 따라서 weekday >= 5인 기록은 검사하지 않습니다.
직원별 전부 통과 여부 확인
직원 한 명의 7일 기록을 순회하면서 평일 출근 시간이 인정 시간보다 늦은 날이 하나라도 있으면 탈락합니다. 모든 평일을 통과한 직원만 결과에 1명을 더합니다.
복잡도
직원 수를 N이라고 하면 각 직원의 7일 기록만 확인하므로 시간 복잡도는 O(7N), 즉 O(N)입니다. 별도의 큰 배열을 만들지 않으므로 추가 공간 복잡도는 O(1)입니다.
핵심 관찰
HHMM은 분 단위 숫자가 아닌 시각 표기입니다. 모든 시각을 분으로 바꾸면 10분의 허용 범위와 출근 기록을 같은 단위에서 비교할 수 있습니다. 주말 여부도 시작 요일에서 기록 날짜만큼 이동한 값으로 결정합니다.
오답 접근과 반례
958 + 10을 968로 계산하면 틀립니다. 9시 58분의 10분 뒤는 10시 8분인 1008입니다. 시작 요일이 금요일일 때처럼 주말이 기록 배열의 앞에 고정되지 않는 경우도 있으므로 날짜별 요일을 계산해야 합니다.
3. 문제 해결 코드 (Python)
def solution(schedules, timelogs, startday):
def to_minutes(time):
return (time // 100) * 60 + (time % 100)
answer = 0
for schedule, logs in zip(schedules, timelogs):
limit = to_minutes(schedule) + 10
qualifies = True
for day, log in enumerate(logs):
weekday = (startday - 1 + day) % 7
# 토요일과 일요일은 이벤트 평가에서 제외합니다.
if weekday >= 5:
continue
if to_minutes(log) > limit:
qualifies = False
break
if qualifies:
answer += 1
return answer
구현 포인트
zip(schedules, timelogs)로 직원의 희망 시간과 7일 기록을 함께 처리합니다.- 출근 인정 시각은
HHMM숫자에 10을 더하지 않고 분 단위로 계산합니다. startday가 금요일이나 주말이어도 날짜를 모듈러 연산으로 계산하면 자연스럽게 다음 주 월요일까지 처리할 수 있습니다.- 평일에 한 번이라도 늦으면 해당 직원의 나머지 기록은 확인하지 않아도 됩니다.
4. 동일한 문제를 어떻게 풀었나 웹검색 하여 요약
공개된 풀이들은 공통적으로 직원별 인정 시각을 구한 뒤, 7일 기록에서 주말을 제외하고 늦은 기록이 있는지 확인하는 방식을 사용합니다.
- 프로그래머스 공식 문제 페이지는 시간 표현이
시 * 100 + 분형식이며 주말은 이벤트 평가에서 제외된다고 설명합니다. - yooputer의 Python 풀이는 출근 희망 시각에 10분을 더할 때 분이 60을 넘으면 시간을 올리는 별도 함수를 사용하고, 이벤트 요일로 주말을 건너뜁니다.
다른 풀이 중에는 HHMM 값을 직접 조정해 분이 60 이상이면 시간을 올리는 방식도 있습니다. 이 방법도 가능하지만, 이 글에서는 모든 시각을 처음부터 분으로 변환해 덧셈과 비교를 같은 단위에서 처리했습니다.
마무리
이 문제에서 가장 주의할 부분은 HHMM 형식의 숫자를 일반 정수처럼 계산하지 않는 것입니다. 시간을 분으로 바꾸고, 시작 요일을 기준으로 주말만 건너뛰면 직원별 조건을 단순한 반복문으로 확인할 수 있습니다.