코딩테스트

[프로그래머스][python] 유연근무제

도도o 2025. 3. 22. 00:38

 

 

문제 설명
프로그래머스 사이트를 운영하는 그렙에서는 재택근무와 함께 출근 희망 시각을 자유롭게 정하는 유연근무제를 시행하고 있습니다. 제도 정착을 위해 오늘부터 일주일 동안 각자 설정한 출근 희망 시각에 늦지 않고 출근한 직원들에게 상품을 주는 이벤트를 진행하려고 합니다.

직원들은 일주일동안 자신이 설정한 출근 희망 시각 + 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 이하입니다.

 


 

나의 풀이

 

상품 지급 조건

평일 출근 시간희망 출근 시각 + 10분 이내여야 함
모든 평일에 지각 없이 출근해야 함

 

주어진 데이터는 schedules(희망 출근 시각)과 timelogs(실제 출근 시각)이며, 주어진 startday(월-일:1-7) 기준으로 주말을 제외한 평일 출근 기록을 확인해야 합니다.

 

 

1) 출근 시각 비교를 위한 반복문

각 직원마다 출근 기준(schedules) 과 실제 출근 기록(timelogs) 을 비교해야 한다.
이를 위해 zip()을 사용해 두 리스트를 동시에 순회한다.

for schedule, timelog in zip(schedules, timelogs):
    # 이후 출근 기록 필터링 및 비교 진행

 

2) 주말 제외 & 평일 기록 추출

timelog 중에서 주말을 제외해야 하기 때문에, startday를 이용하여 평일 데이터만 가져온다.

각 startday 에 따라 가져와야 할 평일 데이터는 다음과 같다.

startday 평일 인덱스
1 (월요일)  timelog[0:5] 
2 (화요일)  timelog[0:4] + timelog[-1:]
3 (수요일) timelog[0:3] + timelog[-2:]
... ...

 

이 과정을 한 줄로 처리하기 위해 리스트를 2배로 확장한 뒤 슬라이싱했다.

수도코드 : weekday_timelog = (timelog* 2)[slicing]

weekday_timelog = (timelog * 2)[8-startday:13-startday]

 

  startday=1 (월요일)이라면 weekday_timelog[7:12] 를 가져오면 되지만,

  startday=2 (화요일) 은 weekday_timelog[6:11]

  startday=3 (수요일) 은 weekday_timelog[5:10]

 

예를 들어, startday=3(수요일)인 경우:

timelog = [900, 910, 920, 930, 940, 950, 950]
weekday_timelog = (timelog * 2)[5:10]  # [900, 910, 920, 930, 940]

 

이제 weekday_timelog에 평일 출근 시각만 남게 된다.

 

 

3) 출근 기준 시각 계산

출근 성공의 기준은 희망 출근 시각(schedule) + 10분 이내이다.
다만, 시간이 변경될 수도 있으므로 이를 고려해야 한다.

time_limit = schedule + 10 + 40*(schedule % 100 >= 50)

 

기본적으로 10분을 추가하고, 분이 50이상이면 40을 추가로 더해준다.

조건문과 정수값을 곱하여 다음과 같이 time_limit를 정의했다.

 

 

4) 상품을 받을 조건 확인하기

평일 출근 기록(weekday_timelog)을 돌면서 한 번이라도 지각하면 실패로 처리해야 한다.

def is_event(weekday_timelog, time_limit):
    for time in weekday_timelog:
        if time > time_limit: # 기준 시간 초과 시 실패
            return 0
    return 1  # 모든 출근이 성공한 경우 1 반환

 

 

is_event 는 성공할 경우 1을 출력하므로, 모든 직원에 대하여 is_event의 결과를 더하면 상품의 받을 직원 수이다.

answer += is_event(weekday_timelog, time_limit)

 

 

최종 제출 답안

def is_event(weekday_timelog, time_limit):
    for time in weekday_timelog:
        if time > time_limit:
            return 0
    return 1

def solution(schedules, timelogs, startday):
    answer = 0
    
    for schedule, timelog in zip(schedules, timelogs):
        # 평일에 해당하는 출근 시간 추출
        weekday_timelog = (timelog * 2)[8-startday:13-startday]
        # 출근 기준 시각
        time_limit = schedule + 10 + 40*(schedule % 100 >= 50)
        
        # 일주일 모두 성공한 직원 확인
        answer += is_event(weekday_timelog, time_limit)
            
    return answer

 

 

 

 

 

 

출처

- https://school.programmers.co.kr/learn/courses/30/lessons/388351