티스토리 뷰
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
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 리코쳇 로봇 파이썬 정답 풀이 (0) | 2025.04.18 |
---|---|
[프로그래머스] [1차] 프렌즈4블록 파이썬 풀이 (0) | 2025.03.19 |
[프로그래머스] 택배상자 파이썬 풀이 (0) | 2024.06.03 |
[프로그래머스] 행렬의 곱셈 파이썬 풀이 (0) | 2024.05.14 |
[프로그래머스] 가장 먼 노드 파이썬 풀이 (0) | 2024.04.01 |