애플파이썬

[프로그래머스] Lv.1 유연근무제 (파이썬) 본문

파이썬/프로그래머스

[프로그래머스] Lv.1 유연근무제 (파이썬)

유진파이 2025. 2. 18. 23:45

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제 설명

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

직원들은 일주일동안 자신이 설정한 출근 희망 시각 + 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):
    answer = 0
    n = len(schedules)
    for i in range(n):
        if schedules[i]%100 + 10 < 60:
            limit = schedules[i] + 10
        else:
            limit = schedules[i] + 50
        cnt = 0
        for j in range(7):
            if startday <= 5:
                if timelogs[i][j] <= limit:
                    cnt += 1
                else:
                    break
            startday = startday%7 + 1

        if cnt == 5:
            answer += 1 
    return answer

 

내가 구현하고 싶었던 코드의 로직은

1. 출근 제한 시간을 구해준다 -> 1055일 경우 1105가 되기 위해서는 50을 더해주면 됨!

2. 각 직원들을 요일별로 돌면서 startday가 5보다 작을 때, 월~금일 때만 검사를 해준다. limit 보다 작으면 cnt를 +1 해주고 클 시에는 break로 바로 빠져나오기(어차피 실패임)

3. cnt == 5일 경우 즉 월~금을 모두 출근 성공했을 경우 answer += 1 해줌 !

근데 틀렸어요 ㅠㅠ

 

# startday 갱신이 문제였던 것 같음!

---- 도저히 감이 안와서 어떤 분의 코드를 슬쩍 봤다.

def solution(s, t, d):
    x = 0
    for i in range(len(s)):
        c = 0
        for j in range(7):
            if 0 < (d + j) % 7 <= 5:
                if t[i][j] // 100 * 60 + t[i][j] % 100 <= s[i] // 100 * 60 + s[i] % 100 + 10:
                    c += 1
        if c == 5:
            x += 1
    return x

 

요일을 이렇게 간단하게 구할 수가 ...! 다른 사람들은 막 엄청 복잡하게 계산을 해놨는데 그냥 반복문 j 를 더해서 7로 나눠주면 되는 거였다

이렇게 하면 매번 새로 갱신할 필요 없이 for문 안에서 자동갱신되기 때문에 ! 천재입니까 당신..?

def solution(schedules, timelogs, startday):
    answer = 0
    n = len(schedules)
    for i in range(n):
        if schedules[i]%100 + 10 < 60:
            limit = schedules[i] + 10
        else:
            limit = schedules[i] + 50
        cnt = 0
        for j in range(7):
            if 1 <= (startday+j)%7 <= 5:
                if timelogs[i][j] <= limit:
                    cnt += 1          
        if cnt == 5:
            answer += 1 
    return answer

 

그래서 저부분만 스리슬쩍 들고와서 고쳤더니 정답 !