[softeer 연습문제] Lv1. 근무 시간

bee·2023년 7월 6일
0

코딩테스트

목록 보기
13/16
post-thumbnail

🔎 문제

당신은 인사팀 직원으로, 각 직원의 근태를 확인하고자 한다.

당신의 회사는 자율출퇴근제를 실시하기 때문에 각 직원이 정확히 몇 시에 출근하는 것은 중요하지 않고, 총 근로 시간이 몇 분인지가 중요하다. 총 근로 시간이 법정근로시간을 초과하지 않아야 하면서, 회사와 직원 사이에 계약한 시간 이상이어야 하기 때문이다.

직원이 하루 동안 근무한 시간은 출근 시각과 퇴근 시각 사이의 시간으로 정의한다. 이 문제에서는 식사 시간 등 근무 외 시간을 근무 시간에서 제외하지 않음에 유의하라.

월요일부터 금요일까지 휴가를 쓰지 않은 직원이 매 요일 언제 출근하고 언제 퇴근했는지가 주어질 때, 이 직원이 5일 동안 총 몇 분을 근무했는지를 구하는 프로그램을 작성하라.

제약조건

직원은 밤을 새서 일하지 않았다. 즉, 출근 시각과 퇴근 시각은 00:00 이후, 24:00 이전에 이루어졌다.

출퇴근 시각은 HH:MM과 같은 형식으로 주어진다.
HH는 00, 01, 02, .., 22, 23 중 하나이다.
MM는 00, 01, 02, .., 58, 59 중 하나이다.
직원은 매일 1분 이상은 일하였다.

입력

첫 번째 줄에는 월요일에 출근한 시각과 월요일에 퇴근한 시각이 공백 하나를 사이로 두고 주어진다.
두 번째 줄에는 화요일에 출근한 시각과 화요일에 퇴근한 시각이 공백 하나를 사이로 두고 주어진다.
세 번째 줄에는 수요일에 출근한 시각과 수요일에 퇴근한 시각이 공백 하나를 사이로 두고 주어진다.
네 번째 줄에는 목요일에 출근한 시각과 목요일에 퇴근한 시각이 공백 하나를 사이로 두고 주어진다.
다섯 번째 줄에는 금요일에 출근한 시각과 금요일에 퇴근한 시각이 공백 하나를 사이로 두고 주어진다.

출력

첫 번째 줄에 직원의 총 근무 시간을 분 단위로 출력한다.

예제

<입력>
10:00 19:00
09:00 15:00
10:00 11:00
11:00 22:00
09:00 15:00

<출력>
1980

월요일에 9시간, 화요일에 6시간, 수요일에 1시간, 목요일에 11시간, 금요일에 6시간을 근무하였다. 총 근무 시간은 9 + 6 + 1 + 11 + 6 = 33시간, 즉 33 × 60 = 1980분이다.





풀이

from datetime import datetime

worktime = [list(input().split()) for _ in range(5)] ## 문자로 입력받음
answer = 0 ## 총 근무시간 (초기화)

for i in range(5):
    a = datetime.strptime(worktime[i][0], '%H:%M') ## 문자열 형식의 출근시간을 datetime 객체로 변환
    b = datetime.strptime(worktime[i][1], '%H:%M') ## 문자열 형식의 퇴근시간을 datetime 객체로 변환
    diff = ((b-a).seconds) // 60 ## 그냥 b-a는 '%H:%M' 포맷 형식이기 때문에 초로 바꿔준 후 60을 나누어 분으로 다시 바꾼다
    answer += diff ## 총 근무시간에 누적

print(answer)

10:00 19:00
09:00 15:00
10:00 11:00
11:00 22:00
09:00 15:00

1980







✅ 정리

1. datetime 모듈과 datetime 클래스

위의 문제와 같이 시간 혹은 날짜 데이터를 처리하고 싶다면, datetime 모듈을 불러와 사용해야 한다.

풀이에서 사용한 datetime 클래스는 날짜와 시간을 동시에 표현하기 위해서 사용된다. 연/월/일/시/분/초/마이크로초 시간대와 원하는 datetime 포맷 형식을 인자로 받아 해당 포맷에 맞게 날짜와 시간을 바꿔준다.

from datetime import datetime





2. datetime.strptime(변환대상, "포맷")

문자열 형식으로 입력받은 날짜/시간 데이터를 원하는 포맷의 datetime 객체로 바꿔주는 함수

📌 datetime 포맷

datetime 포맷의미비고
%Y앞의 공백을 0으로 채우는 4자리 숫자 연도
%m앞의 공백을 0으로 채우는 2자리 숫자 월
%d앞의 공백을 0으로 채우는 2자리 숫자 일
%H앞의 공백을 0으로 채우는 2자리 숫자 시간(24시간)
%M앞의 공백을 0으로 채우는 2자리 숫자 분
%s앞의 공백을 0으로 채우는 2자리 숫자 초
%A요일영어로 된 요일
%B영어로 된 월





3. 날짜 or 시간 연산

총 근무한 시간을 계산해야 하기 때문에 퇴근시간(b)에서 출근시간(a)을 뺀 값을 분으로 바꿔준 후 평일동안의 누적합을 구하면 된다.


※ 만약에 아무런 처리 없이 b에서 a를 그냥 뺀다면 어떻게 될까?

from datetime import datetime
a, b = input().split()
a = datetime.strptime(a, '%H:%M')
b = datetime.strptime(b, '%H:%M')
work = b - a
print(work)

09:00 15:00

6:00:00



풀이에서 a, b는 datetime 객체로 바꿔준 상태의 출/퇴근 시간이기 때문에 b-a에 대한 누적합을 구할 경우 답은 '%H:%M:%S' 의 형태로 출력된다.

때문에 '분' 단위로 출력하기 위해서는 먼저 근무한 시간(b-a)를 (b-a).seconds를 통해서 '초'단위로 바꿔준 다음, 이를 60으로 나누어 '분'으로 바꿔준다. (초 -> 분 : 1초 = 1/60 분)



📌 날짜/시간 연산 관련 속성

날짜/시간 차를 diff라 할 때,

  1. diff.days
    : datetime 객체의 연산값을 '일' 단위로 바꿔준다.

  2. diff.seconds
    : datetime 객체의 연산값을 '초' 단위로 바꿔준다.

  3. diff.microseconds
    : datetime 객체의 연산값을 '마이크로초' 단위로 바꿔준다.

profile
벌집처럼 밀도있게 차곡차곡 쌓아나가는중

0개의 댓글