[문제]
프로그래머스 사이트를 운영하는 그렙에서는 재택근무와 함께 출근 희망 시각을 자유롭게 정하는 유연근무제를 시행하고 있습니다. 제도 정착을 위해 오늘부터 일주일 동안 각자 설정한 출근 희망 시각에 늦지 않고 출근한 직원들에게 상품을 주는 이벤트를 진행하려고 합니다.
직원들은 일주일동안 자신이 설정한 출근 희망 시각 + 10분까지 어플로 출근해야 합니다. 예를 들어 출근 희망 시각이 9시 58분인 직원은 10시 8분까지 출근해야 합니다. 단, 토요일, 일요일의 출근 시각은 이벤트에 영향을 끼치지 않습니다. 직원들은 매일 한 번씩만 어플로 출근하고, 모든 시각은 시에 100을 곱하고 분을 더한 정수로 표현됩니다. 예를 들어 10시 13분은 1013이 되고 9시 58분은 958이 됩니다.
당신은 직원들이 설정한 출근 희망 시각과 실제로 출근한 기록을 바탕으로 상품을 받을 직원이 몇 명인지 알고 싶습니다.
직원 n명이 설정한 출근 희망 시각을 담은 1차원 정수 배열 schedules, 직원들이 일주일 동안 출근한 시각을 담은 2차원 정수 배열 timelogs, 이벤트를 시작한 요일을 의미하는 정수 startday가 매개변수로 주어집니다. 이때 상품을 받을 직원의 수를 return 하도록 solution 함수를 완성해주세요.
[제한사항]
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 이하입니다.
[내 코드]
def solution(schedules, timelogs, startday):
result = len(schedules)
for i in range(len(schedules)):
for j in timelogs[i]:
if j>schedules[i]+10:
result-=1
return result
현재 코드는 각 직원의 실제 출근 시각이 희망 출근 시각 + 10분을 넘는지 확인하여 상품을 받을 수 있는 직원 수를 구하고자 했다.
초기값을 전체 직원 수인 len(schedules)로 설정한 뒤, 출근 조건을 만족하지 못하는 직원이 발견되면 result를 1 감소시키는 방식으로 구현하였다.
주말은 제외시켜야 하는데 일단 구현 후 생각해보려고 하였다.
[수정 코드]
def to_minute(time):
hour = time // 100
minute = time % 100
return hour * 60 + minute
def solution(schedules, timelogs, startday):
answer = 0
for i in range(len(schedules)):
limit_time = to_minute(schedules[i]) + 10
is_success = True
for j in range(7):
day = (startday + j - 1) % 7 + 1
if day == 6 or day == 7:
continue
log_time = to_minute(timelogs[i][j])
if log_time > limit_time:
is_success = False
break
if is_success:
answer += 1
return answer
to_minute 함수는 958, 1013과 같이 정수로 표현된 시간을 실제 분 단위로 바꾸기 위해 사용한다.
예를 들어 958은 9시 58분이므로 9 * 60 + 58 = 598분이 된다.
출근 인정 시각은 희망 출근 시각에서 10분을 더한 값이므로
limit_time = to_minute(schedules[i]) + 10
각 직원마다 7일간의 출근 기록을 확인하면서, 현재 날짜가 토요일이나 일요일이면 검사하지 않고 넘어간다.
현재 요일은 day = (startday + j - 1) % 7 + 1로 구한다.
예를 들어 startday가 5라면 첫째 날은 금요일, 둘째 날은 토요일, 셋째 날은 일요일이 된다.
평일인 경우에는 실제 출근 시각을 분 단위로 변환한 뒤, 출근 인정 시각보다 늦었는지 확인한다.
만약 한 번이라도 늦었다면 상품을 받을 수 없으므로 is_success를 False로 바꾸고 반복문을 종료한다.
마지막까지 is_success가 True라면 해당 직원은 모든 평일에 정상 출근한 것이므로 answer에 1을 더한다.
[시간복잡도]
O(n x 7) ≒ O(n)
'Programmers' 카테고리의 다른 글
| [프로그래머스] 둘만의 암호 (0) | 2026.06.29 |
|---|---|
| [프로그래머스] 크레인 인형뽑기 (0) | 2026.06.26 |
| [프로그래머스] 택배 상자 꺼내기 (0) | 2026.06.22 |
| [프로그래머스] 실패율 (0) | 2026.06.22 |
| [프로그래머스] 가장 가까운 글자 (0) | 2026.05.26 |