프로그래머스 유연근무제 풀이: 시간 변환과 요일 판별
작성·코드 검증: solve together · 작성 언어: Python
0. 문제 링크와 출처
- 문제: 유연근무제
- 출처: 프로그래머스, 2025 프로그래머스 코드챌린지 1차 예선
- 자체 판단 난이도: Level 2
시간 변환과 요일 조건을 처리하면서 직원별 기록을 반복해서 확인해야 하므로 Level 2로 판단했다.
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가 금요일이나 주말이어도 날짜를 모듈러 연산으로 계산하면 자연스럽게 다음 주 월요일까지 처리할 수 있다.- 평일에 한 번이라도 늦으면 해당 직원의 나머지 기록은 확인하지 않아도 된다.
복사해 실행할 테스트
아래 검사를 풀이 코드 아래에 붙여 python 파일명.py로 실행하면 주말 제외와 HHMM 시간 변환을 함께 확인할 수 있다.
assert solution(
[700, 800, 1100],
[
[710, 2359, 1050, 700, 650, 631, 659],
[800, 801, 805, 801, 805, 804, 805],
[1105, 1001, 1002, 600, 1051, 1001, 1002],
],
5,
) == 3
4. 참고 풀이 비교
- yooputer의 Python 풀이는 출근 희망 시각에 10분을 더할 때 분이 60을 넘으면 시간을 올리는 별도 함수를 사용하고, 이벤트 요일로 주말을 건너뛴다.
다른 풀이 중에는 HHMM 값을 직접 조정해 분이 60 이상이면 시간을 올리는 방식도 있다. 이 방법도 가능하지만, 이 글에서는 모든 시각을 처음부터 분으로 변환해 덧셈과 비교를 같은 단위에서 처리했다.
마무리
이 문제에서 가장 주의할 부분은 HHMM 형식의 숫자를 일반 정수처럼 계산하지 않는 것이다. 시간을 분으로 바꾸고, 시작 요일을 기준으로 주말만 건너뛰면 직원별 조건을 단순한 반복문으로 확인할 수 있다.