[PCCP] 해시 - 경고 메일 | 파이썬

SangJin Ham·2023년 6월 27일
0
post-thumbnail

코딩테스트 역량 강화 교육(거점형 특화 프로그램)이라는 프로그램에 참여해 공부한 내용입니다.


해시 - 경고 메일

앞서 공부한 해시을 사용해 경고 메일 문제를 풀어보겠다.


문제

엘리트정보원은 보안실에 극비문서를 보관하고 있습니다.
직원들은 하루동안 보안실을 이용한 총 시간이 특정시간을 넘기면 경고 메일이 받습니다. 매개변수 reports에 보안실을 이용한 출입기록이 주어지고, time에 경고 메일을 받게되는 특정 이용시간이 주어지면 보안실 출입기록을 바탕으로 경고 메일을 받게되는 직원의 이름을 알파 벳 사전순으로 배열에 담아 반환하는 프로그램을 작성하세요.


입출력 예

보안실 출입기록(reports)제한 시간(time)출력(answer)
["john 09:30 in", "daniel 10:05 in", "john 10:15 out", "luis 11:57 in", "john 12:03 in", "john 12:20 out", "luis 12:35 out", "daniel 15:05 out"]60["daniel", "john"]
["bill 09:30 in", "daniel 10:00 in", "bill 11:15 out", "luis 11:57 in", "john 12:03 in", "john 12:20 out", "luis 14:35 out", "daniel 14:55 out"]120["daniel", "luis"]
["cody 09:14 in", "bill 09:25 in", "luis 09:40 in", "bill 10:30 out", "cody 10:35 out", "luis 10:35 out", "bill 11:15 in", "bill 11:22 out", "luis 15:30 in", "luis 15:33 out"]70["bill", "cody"]
["chato 09:15 in", "emilly 10:00 in", "chato 10:15 out", "luis 10:57 in", "daniel 12:00 in", "emilly 12:20 out", "luis 11:20 out", "daniel 15:05 out"]60["daniel", "emilly"]

제한사항

  • reports의 길이는 100,000을 넘지 않습니다.
  • reports의 원소의 직원이름은 중복된 이름은 없으며(동명이인이 없다는 의미), 알파벳 소문자 로만 구성됩니다.
  • reports의 원소의 시간은 HH:MM형식이며, 그 범위는 00:00부터 24:00까지입니다.
  • reports의 원소는 시간순으로 입력됩니다.
  • reports의 원소의 in은 보안실에 입장한 경우이며, out은 보안실에서 퇴장한 경우입니다. 한 직원이 보안실을 입장하고 퇴장하기를 여러번 할 수 있습니다. 입장한 직원은 반드시 퇴장을 합니다.
  • time의 자연수로 분단위 시간을 의미합니다. time이 60이면 60분을 의미하며 특정 직원이 보안실을 60분을 초과해서 이용했다면 경고 메일이 발송됩니다.

코드

from collections import defaultdict
def solution(reports, time):
    answer = []

    def getTime(time):
        H, M = time.split(':')
        return (int(H) * 60) + int(M)
    
    inT = sumT = defaultdict(int)

    for report in reports:
        name, rT, state = report.split()
        if state == 'in':
            inT[name] = getTime(rT)
        else:
            sumT[name] += getTime(rT) - inT[name]
    
    for key in sumT:
        if sumT[key] > time:
            answer.append(key)

    return sorted(answer)

print(solution(["john 09:30 in", "daniel 10:05 in", "john 10:15 out", "luis 11:57 in", "john 12:03 in", "john 12:20 out", "luis 12:35 out", "daniel 15:05 out"], 60))
print(solution(["bill 09:30 in", "daniel 10:00 in", "bill 11:15 out", "luis 11:57 in", "jhon 12:03 in", "jhon 12:20 out", "luis 14:35 out", "daniel 14:55 out"], 120))
print(solution(["cody 09:14 in", "bill 09:25 in", "luis 09:40 in", "bill 10:30 out", "cody 10:35 out", "luis 10:35 out", "bill 11:15 in", "bill 11:22 out", "luis 15:30 in", "luis 15:33 out"], 70))
print(solution(["chato 09:15 in", "emilly 10:00 in", "chato 10:15 out", "luis 10:57 in", "daniel 12:00 in", "emilly 12:20 out", "luis 11:20 out", "daniel 15:05 out"], 60))

풀이

  1. 먼저 09:30 이런 형태로 주어지는 시간을 분으로 변환해주는 getTime(time) 함수를 만들었다.
  2. 사람마다 출입 시간을 저장해주는 사전형 inT와 사람마다 총 이용시간을 저장해주는 sumTdefaultdict(int)를 이용해 모든 key값을 0으로 초기화
  3. 출입기록 하나를 받아
    • in인 경우 : inT[name]출입 시간(나간 시간 - 들어온 시간)을 기록
    • out인 경우 : sumT[name]에 이용 시간을 더함
  4. 출입기록을 다 돌고, sumT에 저장되어있는 이용시간 중 주어진 제한시간 time보다 큰 사람은 answer에 삽입
  5. 이름을 사전순으로 정렬해 return
profile
끄적끄적

0개의 댓글