ABOUT ME

Computer, Music, Video.

Today
Yesterday
Total
  • 2025 프로그래머스 코드챌린지 1차 예선 - 유연근무제
    코딩 테스트/Level 1 2025. 3. 25. 10:29
    반응형

    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 함수를 완성해주세요.

     

    실전용은 아니지만... 재미있게...

    def solution(schedules, timelogs, startday):
        num2time = lambda num: num // 100 * 60 + num % 100
        weekdays = tuple(each if each <= 7 else each - 7 for each in range(startday, startday + 7))
        answer = 0
        for schedule, timelog in zip(schedules, timelogs):
            schedule_time = num2time(schedule)
            for index, each in enumerate(timelog):
                if weekdays[index] == 6 or weekdays[index] == 7:
                    continue
                if num2time(each) - schedule_time > 10:
                    break
            else:
                answer += 1
        return answer

    파이썬에서 lambda를 저렇게 사용하는 것은 안티패턴이다. 
    PEP 8: E731 do not assign a lambda expression, use a def

     

    실전에서는 이렇게 코딩을 할 것 같다. 

    def solution(schedules, timelogs, startday):
        # 외부에서 사용하지 않는 함수라면 내부에서 정의하자.
        def num2time(num):
            """ 시각을 분 단위로 변환 """
            return num // 100 * 60 + num % 100
    
        answer = 0
    
        # 요일 튜플: 시작 요일부터 1주일간
        # 수정이 필요 없을 때는 리스트보다 튜플을 쓰는 것이 좋다.
        weekdays = tuple(each if each <= 7 else each - 7 for each in range(startday, startday + 7))
    
        # zip을 사용해 schedules, timelogs를 묶어 이터레이션 함.
        for schedule, timelog in zip(schedules, timelogs):
            schedule_time = num2time(schedule)
            # 이터레이션 시 인덱스가 필요하면 enumerate
            for index, each in enumerate(timelog):
                # 토, 일요일은 체크를 건너 뜀
                if weekdays[index] == 6 or weekdays[index] == 7:
                    continue
                # 10분을 초과하면 이터레이션을 종료한다.
                if num2time(each) - schedule_time > 10:
                    break
            # for 문에서 else는 파이썬 고유의 문법인데 브레이크 없이 이터레이션을 종료했을 때 실행됨
            else:
                answer += 1
        return answer
    반응형
Designed by Tistory.