2025 프로그래머스 코드챌린지 1차 예선 > Lv1. 유연근무제
문제 설명
프로그래머스 사이트를 운영하는 그렙에서는 재택근무와 함께 출근 희망 시각을 자유롭게 정하는 유연근무제를 시행하고 있습니다. 제도 정착을 위해 오늘부터 일주일 동안 각자 설정한 출근 희망 시각에 늦지 않고 출근한 직원들에게 상품을 주는 이벤트를 진행하려고 합니다.
직원들은 일주일동안 자신이 설정한 출근 희망 시각 + 10분까지 어플로 출근해야 합니다. 예를 들어 출근 희망 시각이 9시 58분인 직원은 10시 8분까지 출근해야 합니다. 단, 토요일, 일요일의 출근 시각은 이벤트에 영향을 끼치지 않습니다. 직원들은 매일 한 번씩만 어플로 출근하고, 모든 시각은 시에 100을 곱하고 분을 더한 정수로 표현됩니다. 예를 들어 10시 13분은 1013이 되고 9시 58분은 958이 됩니다.
당신은 직원들이 설정한 출근 희망 시각과 실제로 출근한 기록을 바탕으로 상품을 받을 직원이 몇 명인지 알고 싶습니다.
직원 n명이 설정한 출근 희망 시각을 담은 1차원 정수 배열 schedules, 직원들이 일주일 동안 출근한 시각을 담은 2차원 정수 배열 timelogs, 이벤트를 시작한 요일을 의미하는 정수 startday가 매개변수로 주어집니다. 이때 상품을 받을 직원의 수를 return 하도록 solution 함수를 완성해주세요.
시각화
하나의 데이터를 가지고 시각화를 하면 다음과 같다.
출근 인정 시각은 출근 희망 시각에서 10분을 더한 시각이다.
출근 인정 시각을 구하면 이제 출근 시간과 값을 비교하여 상품을 받을 직원을 구할 수 있다.
문제 해결 과정
중요한 로직은 크게 2가지가 있다.
- 출근 인정 시각 구하기
- 주말 유무 판별하기
첫 번째는 그렇다쳐도 혹자에게는 주말 유무가 왜 중요한지 이해하기 어려울 수 있다. 이유는 월요일부터 시작하는 것이 아니라 주어진 요일부터 시작하기 때문이다.
출근 인정 시각은 기존의 계산처럼 시간에 100을 곱하고 분을 더한 값이기에 시간과 분을 구하고 싶으면 반대로 나누기와 나머지 연산을 사용하면 된다.
주말 유무는 1이 월요일, 7이 일요일이기 때문에 계산 로직은 아래와 같다. -1 과 +1 이 있는데 이유는 나머지 연산할 때 0 부터 시작하기 때문이다. 그러기에 -1 을 해주어야하고 값이 구해지면 +1을 해주는 것 뿐 특별한 의미는 없다.
today = (startday - 1 + i) % 7 + 1
전체 코드
위 내용을 코드로 구현하면 아래와 같다.
def solution(schedules, timelogs, startday):
late_set = set()
for i, schedule in enumerate(schedules):
schedule += 10
h, m = schedule // 100, schedule % 100
if schedule % 100 >= 60:
h += 1
m -= 60
schedules[i] = h * 100 + m
for i in range(len(timelogs[0])):
today = (startday - 1 + i) % 7 + 1
if today in (6, 7):
continue
for s_i, schedule in enumerate(schedules):
if schedule < timelogs[s_i][i]:
late_set.add(s_i)
return len(schedules) - len(late_set)