티스토리 뷰

728x90

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

 

프로그래머스

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

programmers.co.kr

 

1. 풀이

  • 모듈러 연산(%)으로 미리 주말 인덱스를 계산해두자.

월요일이 1부터 시작하므로 토요일과 일요일은 6, 7이다. 따라서 각 케이스에서의 토요일과 일요일을 나타내는 인덱스는 (6 - startday), (7 - startday)이다. 그럼 이렇게가 끝인가? 아니다!

만약 startday가 일요일이라면? 일요일 인덱스는 0이지만, 토요일 인덱스는 -1이 돼 버린다. 따라서 토요일, 일요일 인덱스를 구할 때는 (6 - startday) % 7, (7 - startday) % 7처럼 모듈러 연산을 사용해줘야 한다.

 

  • 계산하기 쉽도록 주어진 시간 형식을 시간과 분으로 나누고, 10분을 더한 값을 저장해두자.

시간 비교를 하기 위해선 시간(hour)과 분(minute)을 나눠서 가지고 있는 게 편하다. 따라서 schedules 리스트의 원소들을 (시간, 분)의 튜플로 변경해보자. 단, 10분을 더한 다음엔 minute이 60 이상이라면 (hour + 1)하고, (minute - 60)을 해줘야 한다.

 

 

  • 2중 for문을 사용하여 각 직원의 출근 시간을 확인하자.

사람 인원 수만큼 바깥 for문을 돌린다. 이때 인덱스가 i번째 사람을 의미한다. 그리고 내부 for문으론 i번째 사람의 timelogs[i]를 순회하면서 모든 시간이 schedules[i]보다 이르거나 같은지 검사한다.

 

 

 

2. 정답 코드

def solution(schedules, timelogs, startday):
    workers = len(schedules)

    # find weekend index
    saturday_index = (6 - startday) % 7
    sunday_index = (7 - startday) % 7

    # adjust schedule (add 10 minutes)
    for worker in range(workers):
        schedule = schedules[worker]
        hour = schedule // 100
        minute = schedule % 100

        minute += 10

        if minute >= 60:
            hour += 1
            minute -= 60
        
        schedules[worker] = (hour, minute)

    # find successor
    successor = 0
    for worker in range(workers):
        is_successful = True

        hour, minute = schedules[worker]
        for j in range(len(timelogs[worker])):
            if j == saturday_index or j == sunday_index:
                continue

            log = timelogs[worker][j]
            h = log // 100
            m = log % 100

            if not is_safe((hour, minute), (h, m)):
                is_successful = False
                break

        if is_successful:
            successor += 1

    return successor


def is_safe(schedule, log):
    h1, m1 = schedule
    h2, m2 = log

    if h1 > h2:
        return True

    if h1 == h2 and m1 >= m2:
        return True

    return False
728x90