TODAY TIL
안녕하세요! 이번 포스팅에서는 군대 근무 시간 공평성 확인 문제와 관련된 흥미로운 코딩 문제를 다뤄보겠습니다. 단계적으로 설명하고 코드 구현을 공유합니다.
군대 근무 시간 공평성 확인 문제 풀이 (단계별 접근법)
문제 개요
푸앙이와 동기들은 군대에서 4교대 근무를 합니다. 각 시간대(08:00 :12:00, 12:00 : 18:00, 18:00 :22:00, 22:00 :08:00)별로 근무 시간이 다르고, 각자의 근무 시간이 최대한 공평하게 배분되기를 원합니다. 주어진 근무표가 공평하게 분배되었는지, 즉 각 근무자의 총 근무 시간 차이가 12시간 이하인지 판단하는 프로그램을 작성해보겠습니다.
단계별 문제 해결 과정
1단계: 문제 이해하기
- 주어진 정보
- 주 수(N)가 주어지고, 각 주마다 4개의 근무 시간이 제공됩니다.
- 시간대는 각각 4시간, 6시간, 4시간, 10시간으로 구성됩니다.
- 근무표에서 -는 근무자가 없는 것을 의미하고, 근무자가 여러 명일 경우 공백으로 구분됩니다.
- 목표
- 근무표에서 모든 근무자의 총 근무 시간을 계산하여, 최대 근무 시간과 최소 근무 시간의 차이가 12시간 이하인지 확인합니다.
- 근무자가 없는 경우는 공평한 것으로 간주합니다.
2단계: 계획 세우기
- 입력 처리: 주의 개수 N을 입력받고, 각 주별로 4줄씩 근무표를 읽어옵니다.
- 근무 시간 계산하기: 각 시간대의 근무자를 확인하여 근무 시간을 누적합니다. 각 시간대에 따라 4, 6, 4, 10시간을 해당 근무자에게 추가합니다.
- 공평성 검사: 모든 근무자의 근무 시간을 비교하여 차이가 12시간 이하인지 확인하고, 결과를 출력합니다.
3단계: 코드 작성 (단계별로 해결)
각 단계를 코드로 작성하면서 이해해보겠습니다
# 1. 입력 처리
N = int(input()) # 주의 개수 입력받기
schedule = [input().strip() for _ in range(N * 4)] # 전체 근무표 입력받기
설명: N은 주의 개수이고, 근무표는 N * 4 줄로 주어집니다. schedule 리스트에 각 줄을 저장합니다.
# 2. 근무 시간 정의
hours = [4, 6, 4, 10] # 각 시간대의 근무 시간 (08:00~12:00, 12:00~18:00, 18:00~22:00, 22:00~08:00)
work_time = {} # 각 사람의 총 근무 시간을 저장할 딕셔너리
- 설명: 각 시간대별 근무 시간을 리스트에 저장하여 반복문에서 참조하기 쉽게 합니다.
- 딕셔너리 생성: work_time은 각 근무자의 이름을 키로 하고 근무 시간을 값으로 저장합니다.
# 3. 근무 시간 누적 계산
for i in range(N): # 매 주마다 4개의 시간대가 있음
for j in range(4): # 각 시간대별로 근무자 확인
people = schedule[i * 4 + j].split() # 각 시간대별 근무자를 공백으로 분리
for person in people:
if person != '-': # 근무자가 있는 경우만 처리
if person not in work_time:
work_time[person] = 0
work_time[person] += hours[j] # 해당 시간대의 근무 시간을 더해줌
설명: i와 j를 이용해 각 주의 근무표에서 4개의 시간대를 차례로 가져오고, split()으로 각 시간대별 근무자를 분리합니다. -이 아닌 근무자에게만 시간을 누적합니다.
# 4. 공평성 검사
if work_time: # 근무자가 있는 경우
max_hours = max(work_time.values())
min_hours = min(work_time.values())
print("Yes" if max_hours - min_hours <= 12 else "No")
else: # 근무자가 없는 경우
print("Yes")
- 설명: 모든 근무자의 근무 시간을 비교하여 차이가 12시간 이하인 경우 “Yes”, 그렇지 않으면 “No”를 출력합니다.
- 예외 처리: 근무자가 없다면 바로 "Yes"를 출력합니다.
코드 전체
위의 각 단계를 하나의 코드로 합치면 다음과 같습니다.
# 입력 처리
N = int(input()) # 주의 개수
schedule = [input().strip() for _ in range(N * 4)] # 전체 근무표 입력받기
# 각 시간대에 해당하는 근무 시간 정의
hours = [4, 6, 4, 10] # 08:00~12:00, 12:00~18:00, 18:00~22:00, 22:00~08:00
work_time = {} # 각 사람의 총 근무 시간을 저장할 딕셔너리
# 근무 시간 계산
for i in range(N): # 매 주마다 4개의 시간대가 있음
for j in range(4): # 각 시간대별로 근무자 확인
people = schedule[i * 4 + j].split() # 각 시간대별 근무자를 분리
for person in people:
if person != '-': # 근무자가 있는 경우만
if person not in work_time:
work_time[person] = 0
work_time[person] += hours[j] # 해당 시간대의 근무 시간을 추가
# 공평성 검사
if work_time: # 근무자가 있는 경우
max_hours = max(work_time.values())
min_hours = min(work_time.values())
print("Yes" if max_hours - min_hours <= 12 else "No")
else: # 근무자가 없는 경우
print("Yes")
결론
이 문제를 통해 단계별로 문제를 나누어 풀어보았습니다. 입력을 먼저 처리한 후, 근무 시간을 누적 계산하고 공평성을 검사하는 방식으로 해결했습니다. 각 단계마다 목표를 명확히 설정하고 코드를 작성해 가면 더욱 이해하기 쉬울 것입니다.
'python' 카테고리의 다른 글
99클럽 코테 스터디_4기 10일차 TIL (2) | 2024.11.07 |
---|---|
99클럽 코테 스터디_4기 9일차 TIL (0) | 2024.11.05 |
99클럽 코테 스터디_4기 7일차 TIL (0) | 2024.11.04 |
99클럽 코테 스터디_4기 6일차 TIL (3) | 2024.11.03 |
99클럽 코테 스터디_4기 5일차 TIL (0) | 2024.11.01 |